Sichtbare Eigenschaft die man nicht ändern darf
T-Rex
- php
Moin,
hab da eine Klasse. Diese Klasse liest beim initialisieren diverse Informationen aus der Datenbank (Tabelle). So z.B. den Primary Key (da gibts immer nur ein Feld für).
Jetzt möchte ich zwecks Übersicht keine Methode(n) welche mir die Informationen liefern, sondern am liebsten so ein Konstrukt:
$objKlasse::namePrimaryKey oder $objKlasse->namePrimaryKey
Wichtig ist, dass man die Infos nicht verfälschen kann. Also hab ich da an eine Klassekonstante gedacht. Aufgrund der Wertzuweisung nach der Initialisierung kommt das aber wiederum nicht in Frage, ergo muss es eine Public Eigenschaft sein. Diese könnte man aber jeder Zeit ändern.
Lösung?
Gruß
Konstanter Konstantin aus Konstanz
T-Rex
Hi,
Jetzt möchte ich zwecks Übersicht keine Methode(n) welche mir die Informationen liefern, sondern am liebsten so ein Konstrukt:
$objKlasse::namePrimaryKey oder $objKlasse->namePrimaryKeyWichtig ist, dass man die Infos nicht verfälschen kann. Also hab ich da an eine Klassekonstante gedacht. Aufgrund der Wertzuweisung nach der Initialisierung kommt das aber wiederum nicht in Frage, ergo muss es eine Public Eigenschaft sein. Diese könnte man aber jeder Zeit ändern.
Lösung?
public getter, private setter?
(Beide sind de facto public, aber der setter könnte ja prüfen, wer ihn gerade aufruft.)
MfG ChrisB
public getter
Ist doch wieder eine Methode oder?
Gerade die will ich ja nicht :D.
Gruß
der mit den komischen Wünschen
T-Rex
Hi,
public getter
Ist doch wieder eine Methode oder?
Gerade die will ich ja nicht :D.
Nenne die Eigenschaft intern anders, und biete sie über __get an.
z.B.
class TTT {
private $_myfield;
public function __get($name) {
if ($name == 'myfield') {
return $this->_myfield;
}
}
public function __construct() {
$this->_myfield = '1234567890qwet';
}
}
$obj = new TTT();
echo $obj->myfield;
Man beachte, dass das Feld _myfield heißt (mit Unterstrich).
Bis die Tage,
Matti
Das ist eine schöne Lösung :)
Wobei zur Vervollständigung fehlt noch die Set Methode:
class TTT {
private $_myfield;
public function __get($name) {
if ($name == 'myfield') {
return $this->_myfield;
}
}
public function __set($name,$value) {
if ($name != 'myfield') {
$this->$name = $value;
}
}
public function __construct() {
$this->_myfield = '1234567890qwet';
}
}
Danke !
Gruß
Dem Geholfen wurde
T-Rex
Tach!
Das ist eine schöne Lösung :)
Wobei zur Vervollständigung fehlt noch die Set Methode:
Nein, dann kannst du ja gleich ein les- und schreibbares public $myfield; nehmen. Für das Schreiben in das private $_myfield; braucht es keine __set()-Methode.
dedlfix.
Hello,
Nein, dann kannst du ja gleich ein les- und schreibbares public $myfield; nehmen. Für das Schreiben in das private $_myfield; braucht es keine __set()-Methode.
Versuch doch mal mit seiner __set-Methode das 'myField' zu beschreiben. :-)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Tach!
Nein, dann kannst du ja gleich ein les- und schreibbares public $myfield; nehmen. Für das Schreiben in das private $_myfield; braucht es keine __set()-Methode.
Versuch doch mal mit seiner __set-Methode das 'myField' zu beschreiben. :-)
Ach, da ist ein != ... na, das ist ja einerseits für das Vorhaben unnötig, andererseits kann man damit alle anderen - auch privaten - Variablen beschreiben.
dedlfix.
Ach, da ist ein != ... na, das ist ja einerseits für das Vorhaben unnötig
Nein ist es nicht, denn von Außen könnte man immer noch die Public Eigenschaft setzen und dann wird die dem __get bevorzugt. Dann hätte der Workaround nichts gebracht, da man immer direkt auf die Public Eigenschaft zugreifen würde
andererseits kann man damit alle anderen - auch privaten - Variablen beschreiben.
hmmm... das hab ich nicht getestet, dass ist eine gute idee :).
Gruß
der halb getestete
T-Rex
Tach!
Ach, da ist ein != ... na, das ist ja einerseits für das Vorhaben unnötig
Nein ist es nicht, denn von Außen könnte man immer noch die Public Eigenschaft setzen und dann wird die dem __get bevorzugt. Dann hätte der Workaround nichts gebracht, da man immer direkt auf die Public Eigenschaft zugreifen würde
Stimmt auch wieder. Wenn keine Public-Eigenschaft vorhanden ist, dann wird sie ja einfach gesetzt, wenn kein __set() das verhindert.
Es gibt aber eine bessere Lösung: mach die Eingenschaft mit ihrem richtigen Namen private und schreib nur einen Zugriff über __get(). Damit kann man die "private" Eigenschaft lesen, weil __get() quasi stärker als private ist, aber beim Schreiben kommt ein Fatal error: Cannot access private property.
andererseits kann man damit alle anderen - auch privaten - Variablen beschreiben.
hmmm... das hab ich nicht getestet, dass ist eine gute idee :).
Du hast jetzt eine Blacklist, willst aber eigentlich eien Whitelist haben. (Ohne Eintrag für deine Eigenschaft, also eine leere Whtelist, wenn nicht noch was anderes erlaubt sein soll.)
dedlfix.
Hi,
Das ist eine schöne Lösung :)
Das ist ja auch das, was ich vorschlug.
Und selbstverständlich nutzt es eine zusätzliche Methode – was du gerade vorher angeblich explizit nicht wolltest.
MfG ChrisB