Getter und Setter
am 13.09.2006 13:01:51 von Michael Jostmeyer
Hi,
In http://de.php.net/manual/de/language.oop5.overloading.php steht,
__get und __set werden nur beim Aufruf nicht bekannter Member aufgerufen.
Ich habe jetzt folgendes Problem: Ich muss eingegebene Daten in einem
Objekt zwischenspeichern, um sie beim nächsten Aufruf wieder auszulesen.
Bei bestimmten Daten gibt es hier ein paar Routinen, die vorher
durchgelaufen werden müssen.
Ich habe das (bis auf die Routinen) bislang folgendermassen gelöst:
Ich sende das ausgefüllte Formular per Post ab und weise die POST-Werte
in einer Schleife den gleichlautenden Properties der Klasse zu.
So weit funktioniert das sehr gut. Nur möchte ich wie gesagt bei ein
paar Properties beim Setzen (und später auch beim Auslesen) ein paar
Routinen durchlaufen.
Aus anderen Programmiersprachen sind mit Getter und Setter bekannt, die
diese Funktionalität bieten. Nur PHP scheint sich entschieden zu haben,
diese Funktionalität nur bei unbekannten Properties zu bieten.
Kann man so etwas umgehen/anders lösen? Ich möchte nur ungerne die Namen
der Properties ändern.
MfG Josi
Re: Getter und Setter
am 13.09.2006 13:16:55 von Helmut Chang
Michael Jostmeyer schrieb:
> In http://de.php.net/manual/de/language.oop5.overloading.php steht,
> __get und __set werden nur beim Aufruf nicht bekannter Member aufgerufen.
> Ich habe jetzt folgendes Problem: Ich muss eingegebene Daten in einem
> Objekt zwischenspeichern, um sie beim nächsten Aufruf wieder auszulesen.
> Bei bestimmten Daten gibt es hier ein paar Routinen, die vorher
> durchgelaufen werden müssen.
> Ich habe das (bis auf die Routinen) bislang folgendermassen gelöst:
> Ich sende das ausgefüllte Formular per Post ab und weise die POST-Werte
> in einer Schleife den gleichlautenden Properties der Klasse zu.
> So weit funktioniert das sehr gut. Nur möchte ich wie gesagt bei ein
> paar Properties beim Setzen (und später auch beim Auslesen) ein paar
> Routinen durchlaufen.
> Aus anderen Programmiersprachen sind mit Getter und Setter bekannt, die
> diese Funktionalität bieten. Nur PHP scheint sich entschieden zu haben,
> diese Funktionalität nur bei unbekannten Properties zu bieten.
> Kann man so etwas umgehen/anders lösen? Ich möchte nur ungerne die Namen
> der Properties ändern.
Welche Programmiersprachen meinst du da? Das Konzept der Properties ist
ja auch nicht allen zu eigen. Selber habe ich damit nur Erfahrung in C#
bzw. VB. Und dort sind Properties ja auch nicht dasselbe wie Member,
sondern dienen dazu, die Member zu kapseln. Implementieren muss man die
Properties aber auch selber. In anderen Sprachen (bspw. Java) muss man
dazu Methoden verwenden. In PHP bspw.:
class Foo {
protected $property;
public function setProperty($property) {
// Hier kannst du deine Routinen einfügen, aufrufen...
$this->property = $property;
}
public function getProperty() {
// Hier kannst du deine Routinen einfügen, aufrufen...
return $this->property;
}
}
?>
Oder hab ich alles fclash verstanden?
gruss, heli
Re: Getter und Setter
am 13.09.2006 13:19:43 von Knut Kohl
Hallo Michael,
Michael Jostmeyer schrieb am 13. Sep 2006 in de.comp.lang.php.misc:
> Hi,
> In http://de.php.net/manual/de/language.oop5.overloading.php steht,
> __get und __set werden nur beim Aufruf nicht bekannter Member aufgerufen.
> Ich habe jetzt folgendes Problem: Ich muss eingegebene Daten in einem
> Objekt zwischenspeichern, um sie beim nächsten Aufruf wieder auszulesen.
> Bei bestimmten Daten gibt es hier ein paar Routinen, die vorher
> durchgelaufen werden müssen.
> Ich habe das (bis auf die Routinen) bislang folgendermassen gelöst:
> Ich sende das ausgefüllte Formular per Post ab und weise die POST-Werte
> in einer Schleife den gleichlautenden Properties der Klasse zu.
> So weit funktioniert das sehr gut. Nur möchte ich wie gesagt bei ein
> paar Properties beim Setzen (und später auch beim Auslesen) ein paar
> Routinen durchlaufen.
> Aus anderen Programmiersprachen sind mit Getter und Setter bekannt, die
> diese Funktionalität bieten. Nur PHP scheint sich entschieden zu haben,
> diese Funktionalität nur bei unbekannten Properties zu bieten.
> Kann man so etwas umgehen/anders lösen? Ich möchte nur ungerne die Namen
> der Properties ändern.
> MfG Josi
Ich habe das mal in etwa so gelöst:
error_reporting(E_ALL);
class test {
private $data = array();
public function __set($key,$val) {
$func = '__set_'.$key;
if (method_exists($this,$func)) {
$val = $this->$func($val);
}
$this->data[$key] = $val;
}
public function __get($key) {
$val = isset($this->data[$key])
? $this->data[$key]
: NULL;
$func = '__get_'.$key;
if (method_exists($this,$func)) {
$val = $this->$func($val);
}
return $val;
}
private function __set_Square($val) {
return 2 * (int)$val;
}
private function __get_Square($val) {
return (int)$val / 2;
}
}
$o = new test;
$o->Square = '2';
$o->SomeVar = 'X';
echo '
';
print_r($o);
echo '$o->Square [',$o->Square,']
';
echo '$o->SomeNotExisting ['.$o->SomeNotExisting.']';
echo '
';
?>
Regards,
Knut
--
Newsoffice.de - Die Onlinesoftware zum Lesen und Schreiben im Usenet
Re: Getter und Setter
am 13.09.2006 13:23:38 von Michael Jostmeyer
Helmut Chang schrieb:
> Welche Programmiersprachen meinst du da? Das Konzept der Properties ist
> ja auch nicht allen zu eigen. Selber habe ich damit nur Erfahrung in C#
> bzw. VB. Und dort sind Properties ja auch nicht dasselbe wie Member,
> sondern dienen dazu, die Member zu kapseln. Implementieren muss man die
> Properties aber auch selber. In anderen Sprachen (bspw. Java) muss man
> dazu Methoden verwenden. In PHP bspw.:
Hm, danke, Du hast mir mit dem Satz "Properties ja auch nicht dasselbe
wie Member" geholfen.
Damit habe ich zwar mein Problem noch nicht ganz gelöst, aber zumindest
habe ich jetzt schon mal einen Ansatz. Ich werde einfach die Member auf
private setzen und dann müssten eigentlich __get und __set dafür
aufgerufen werden ;-)
MfG Josi
Re: Getter und Setter
am 13.09.2006 13:28:58 von Michael Jostmeyer
Knut Kohl schrieb:
> Hallo Michael,
>
> Michael Jostmeyer schrieb am 13. Sep 2006 in de.comp.lang.php.misc:
>
>> Hi,
>
>> In http://de.php.net/manual/de/language.oop5.overloading.php steht,
>> __get und __set werden nur beim Aufruf nicht bekannter Member aufgerufen.
>> Ich habe jetzt folgendes Problem: Ich muss eingegebene Daten in einem
>> Objekt zwischenspeichern, um sie beim nächsten Aufruf wieder auszulesen.
>> Bei bestimmten Daten gibt es hier ein paar Routinen, die vorher
>> durchgelaufen werden müssen.
>> Ich habe das (bis auf die Routinen) bislang folgendermassen gelöst:
>> Ich sende das ausgefüllte Formular per Post ab und weise die POST-Werte
>> in einer Schleife den gleichlautenden Properties der Klasse zu.
>> So weit funktioniert das sehr gut. Nur möchte ich wie gesagt bei ein
>> paar Properties beim Setzen (und später auch beim Auslesen) ein paar
>> Routinen durchlaufen.
>> Aus anderen Programmiersprachen sind mit Getter und Setter bekannt, die
>> diese Funktionalität bieten. Nur PHP scheint sich entschieden zu haben,
>> diese Funktionalität nur bei unbekannten Properties zu bieten.
>> Kann man so etwas umgehen/anders lösen? Ich möchte nur ungerne die Namen
>> der Properties ändern.
>
>> MfG Josi
>
> Ich habe das mal in etwa so gelöst:
>
>
>
> error_reporting(E_ALL);
>
> class test {
>
> private $data = array();
>
> public function __set($key,$val) {
> $func = '__set_'.$key;
> if (method_exists($this,$func)) {
> $val = $this->$func($val);
> }
> $this->data[$key] = $val;
> }
>
> public function __get($key) {
> $val = isset($this->data[$key])
> ? $this->data[$key]
> : NULL;
> $func = '__get_'.$key;
> if (method_exists($this,$func)) {
> $val = $this->$func($val);
> }
> return $val;
> }
>
> private function __set_Square($val) {
> return 2 * (int)$val;
> }
>
> private function __get_Square($val) {
> return (int)$val / 2;
> }
> }
>
> $o = new test;
> $o->Square = '2';
> $o->SomeVar = 'X';
>
> echo '
';
> print_r($o);
> echo '$o->Square [',$o->Square,']
';
> echo '$o->SomeNotExisting ['.$o->SomeNotExisting.']';
> echo '
';
>
> ?>
>
> Regards,
>
> Knut
>
>
Vielen Dank, der Groschen ist bei mir mit dem Stichwort "private"
gefallen, ich hatte diese Member alle auf public.
Damit sollte es klappen
MfG Josi
Re: Getter und Setter
am 13.09.2006 13:33:11 von Ulf Kadner
Knut Kohl wrote:
> public function __set($key,$val) {
>
> public function __get($key) {
Besser gleich beide magischen Methoden als private setzen. Ein public
ist für ein korrektes Funktionieren nicht notwendig.
MfG, Ulf
Re: Getter und Setter
am 13.09.2006 13:44:09 von Knut Kohl
Hallo Ulf,
Ulf Kadner schrieb am 13. Sep 2006 in de.comp.lang.php.misc:
> Knut Kohl wrote:
>> public function __set($key,$val) {
>>
>> public function __get($key) {
> Besser gleich beide magischen Methoden als private setzen. Ein public
> ist für ein korrektes Funktionieren nicht notwendig.
Klar richtig, würde sogar sagen unbedingt auf private setzen!
Auch würde ich nach nochmaligem Nachdenken die __get_XXXXXX,
__set_XXXXXX Mthoden auf protected setzen, damit sie in abgeleiteten
Klassen ggf. überschrieben werden können.
> MfG, Ulf
Knut
--
Newsoffice.de - Die Onlinesoftware zum Lesen und Schreiben im Usenet