Wie ein Nur-Lese-Member-Variable in PHP implementieren?
-
23-09-2019 - |
Frage
Beim Versuch, es zu ändern, eine Ausnahme aus.
Lösung
ich eine Lösung annehmen, für Klasseneigenschaften, wäre:
- keine Eigenschaft mit dem Namen festlegen, dass Sie interessiert
- verwenden, um die Magie
__get
Methode zuzugreifen, die Eigenschaft, mit dem „falschen“ namen - die
__set
Methode definieren, so dass es eine Ausnahme auslöst, wenn diese Eigenschaft zu setzen versuchen. - Siehe Overloading , um weitere Informationen zu magischen Methoden.
Für Variablen, ich glaube nicht, ist es möglich, eine schreibgeschützte Variable zu haben, für die PHP eine Ausnahme ausgelöst wird, wenn Sie schreiben, um es versuchen.
Betrachten wir zum Beispiel diese kleine Klasse:
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
}
}
}
Instanziierung der Klasse und versucht, die Eigenschaft zu lesen:
$a = new MyClass();
echo $a->myVar . '<br />';
Werden Sie die erwartete Ausgabe:
test
Bei dem Versuch, die Immobilie zu schreiben:
$a->myVar = 10;
Wollen Sie eine Ausnahme erhalten:
Exception: not allowed : myVar in /.../temp.php on line 19
Andere Tipps
class test {
const CANT_CHANGE_ME = 1;
}
und Sie finden es als test::CANT_CHANGE_ME
eine Konstante verwenden. Stichwort const
Ich weiß, das ist eine alte Fragen, aber PASCAL Die Antwort hat mir wirklich geholfen, und ich wollte es ein wenig hinzuzufügen.
__ get () feuert nicht nur auf nicht vorhandenen Eigenschaften, aber „nicht zugänglich“ Einsen als auch, zum Beispiel geschützte. Dies macht es einfach schreibgeschützte Eigenschaften machen!
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;
}
}
}
Die kurze Antwort ist, dass Sie nicht ein schreibgeschützte Objekt Membervariable in PHP erstellen.
In der Tat, die meisten objektorientierten Sprachen betrachten es als schlechte Form Variablen Mitglied öffentlich sowieso zu entlarven ... (C # ist die große, hässliche Ausnahme mit seinen Eigenschaft-Konstrukten).
Wenn Sie eine Klassenvariable möchten, verwenden Sie das const
Stichwort:
class MyClass {
public const myVariable = 'x';
}
Diese Variable kann zugegriffen werden:
echo MyClass::myVariable;
Diese Variable wird genau eine Version gibt es in unabhängig davon, wie viele verschiedenen Objekten des Typ MyClass
Sie erstellen und in den meisten objektorientierten Szenarien hat es wenig bis gar keine Verwendung.
Wenn Sie jedoch wollen eine schreibgeschützte Variable, die unterschiedlichen Werte pro Objekt haben kann, sollten Sie eine private Variable verwenden und eine Zugriffsmethode (ak ein Getter):
class MyClass {
private $myVariable;
public function getMyVariable() {
return $this->myVariable;
}
public function __construct($myVar) {
$this->myVariable = $myVar;
}
}
Die Variable wird im Konstruktor festgelegt, und es wird gemacht wird schreibgeschützt, indem nicht eine Setter haben. Aber jede Instanz MyClass
kann seinen eigenen Wert für myVariable
hat.
$a = new MyClass(1);
$b = new MyClass(2);
echo $a->getMyVariable(); // 1
echo $b->getMyVariable(); // 2
$a->setMyVariable(3); // causes an error - the method doesn't exist
$a->myVariable = 3; // also error - the variable is private