Quando si tenta di cambiarlo, lanciare un'eccezione.Come implementare una variabile membro di sola lettura in PHP?
risposta
immagino una soluzione, per le proprietà di classe, sarebbe quello di:
- non definiscono una proprietà con il nome che ti interessa
- utilizzare il metodo magico
__get
per accedere a tale proprietà, utilizzando il Il nome "falso" - definisce il metodo
__set
in modo da generare un'eccezione quando si tenta di impostare tale proprietà. - Vedere Overloading, per ulteriori informazioni sui metodi magici.
Per le variabili, non credo sia possibile avere una variabile di sola lettura per i quali il PHP un'eccezione quando si sta cercando di scrivere.
Ad esempio, si consideri questa piccola classe:
class MyClass {
protected $_data = array(
'myVar' => 'test'
);
public function __get($name) {
if (isset($this->_data[$name])) {
return $this->_data[$name];
} else {
// non-existant property
// => up to you to decide what to do
}
}
public function __set($name, $value) {
if ($name === 'myVar') {
throw new Exception("not allowed : $name");
} else {
// => up to you to decide what to do
}
}
}
instanciating la classe e cercando di leggere la proprietà:
$a = new MyClass();
echo $a->myVar . '<br />';
ti porterà i risultati attesi:
test
Durante il tentativo di scrivere sul corretto ty:
$a->myVar = 10;
si arriva un'eccezione:
Exception: not allowed : myVar in /.../temp.php on line 19
class test {
const CANT_CHANGE_ME = 1;
}
e si riferiscono come test::CANT_CHANGE_ME
Come verrà generata un'eccezione personalizzata? – user198729
non sarà generato un'eccezione, ma un errore di analisi ... –
@ user198729 Perché si vuole * * a un'eccezione personalizzata? – meagar
utilizzare una costante. Chiave const
So che questa è una vecchia questione, ma la risposta di Pascal mi ha veramente aiutato e volevo aggiungere ad essa un po '.
__get() attiva non solo proprietà inesistenti, ma anche "inaccessibili", ad es. quelli protetti. Questo rende facile creare proprietà di sola lettura!
class MyClass {
protected $this;
protected $that;
protected $theOther;
public function __get($name) {
if (isset($this->$name)) {
return $this->$name;
} else {
throw new Exception("Call to nonexistent '$name' property of MyClass class");
return false;
}
}
public function __set($name) {
if (isset($this->$name)) {
throw new Exception("Tried to set nonexistent '$name' property of MyClass class");
return false;
} else {
throw new Exception("Tried to set read-only '$name' property of MyClass class");
return false;
}
}
}
- 1. Come scoprire se una variabile membro è in sola lettura?
- 2. proprietà di sola lettura in PHP?
- 3. Come creare una variabile di sola lettura locale in bash?
- 4. C# restituisce una variabile come sola lettura da get; impostato;
- 5. Crea una sola tabella in mysql di sola lettura
- 6. sola lettura vs auto (sola lettura) Proprietà
- 7. prova C se variabile è in sola lettura sezione
- 8. Come creare una tabella di sola lettura in SQL Server?
- 9. Come rappresentare una proprietà di sola lettura in un'API REST
- 10. Come definire una variabile di lettura/scrittura globale in Spark
- 11. PHP - Filetype foglio di calcolo di sola lettura?
- 12. : Creare una parte di sola lettura
- 13. es6 importa come una vista di sola lettura comprensione
- 14. Objective-C - La variabile di sola lettura non è assegnabile?
- 15. Come dichiarare una variabile globale in php?
- 16. Class - come fornire accesso in sola lettura al contenitore di membro della classe
- 17. Swift di sola lettura esterna, proprietà di lettura interna
- 18. Scrittura in una sessione di sola lettura in MVC 3+
- 19. Modello intero in sola lettura
- 20. Come impostare una riga MySQL in sola lettura?
- 21. sola lettura attribuiscono alternare
- 22. Come fare DropDownList sola lettura in C#
- 23. DataGridView celle di sola lettura
- 24. Proprietà di sola lettura in Objective-C?
- 25. Proprietà di sola lettura OData
- 26. Come si crea una proprietà Dipendenza di sola lettura?
- 27. Come creare un file di "sola lettura"?
- 28. Canale di sola lettura Canale
- 29. Comprendere come implementare una macro lisp una sola volta
- 30. diritti di accesso in sola lettura CouchDB
Buona risposta! BTW, a cosa serve "__call"? – user198729
'__call' viene chiamata quando si sta cercando di chiamare un metodo che non esce nella classe (come' __get' viene chiamata quando si sta cercando di leggere una proprietà che non esiste nella classe) - vedi http://fr2.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods –
@Pascal MARTIN, grazie! so anche che sei un utente esperto di symfony/doctrine , si può dare un'occhiata a questo post: http: //stackoverflow.com/questions/2339800/how-can-i-fetch-the-entire-tree-in-a-single-query-with-doctrine? – user198729