__get (); __set (); | deklaration/definition/initialisierung

__get (); __set (); | deklaration/definition/initialisierung

am 31.07.2006 16:55:26 von Helmuth Gronewold

Hallo!

Ich schreibe zur Zeit eine Klasse in PHP 5 und interessiere mich für die
Methoden __get (); und __set();.

Neben mir liegt das Buch "Umsteigen auf PHP 5" in dem diese Methoden
behandelt werden.
Allerdings ist mir die Erklärung /wann/ diese Methoden aufgerufen werden
nicht ganz klar.

Geschrieben steht, dass sie aufgerufen werden, wenn ein Attribut noch
nicht /definiert/ ist. Was genau meint der Autor?
Ist definition == deklaration?
Oder definition == initialisierun?
Oder definition == deklaration && initialisierung?

Zur Erklärung hier die Metoden, wie sie im Buch geschrieben stehen:
---------------snip---------------
class Something {
private $daten;
public function __get ($eigenschaft) {
if (isset ($this->daten[$eigenschaft]))
return $this->daten[$eigenschaft];
else
return FALSE;
}
public function __set ($eigenschaft, $wert) {
$this->daten[$eigenschaft] = $wert;
}
}
---------------snap---------------

Gilt das sobald das Attribut auftaucht?
Also sobald ich mein Array vorher deklariere?

$daten['name'];
$daten['vorname'];


Oder werden die Methoden nicht aufgerufen sobald ich ein Attribut direkt
in der Klasse deklariere?

class MyClass {
private name;
private vorname;
}

Danke!

Gruß,
Helmuth

Re: __get (); __set (); | deklaration/definition/initialisierung

am 31.07.2006 16:59:53 von Frank Schenk

> Oder werden die Methoden nicht aufgerufen sobald ich ein Attribut direkt
> in der Klasse deklariere?
>
> class MyClass {
> private name;
> private vorname;
> }

So, steht aber auch im offiziellen Handbuch unter www.php.net


>
> Danke!

Bitte

Frank

Re: __get (); __set (); | deklaration/definition/initialisierung

am 31.07.2006 20:01:26 von Ulf Kadner

Helmuth Gronewold wrote:

> Ich schreibe zur Zeit eine Klasse in PHP 5 und interessiere mich für die
> Methoden __get (); und __set();.

Das taten wohl schon andere, weshalbst wohl auch im Manual beschrieben
steht. :-)

> Geschrieben steht, dass sie aufgerufen werden, wenn ein Attribut noch
> nicht /definiert/ ist. Was genau meint der Autor?

Das die Methoden aufgerufen wird wenn auf ein Undefiniertes Atrribut
lesend __get oder schreibend __set zugriffen werden soll.

> Ist definition == deklaration?
> Oder definition == initialisierun?
> Oder definition == deklaration && initialisierung?

Was willst Du damit Fragen?

> ---------------snip---------------
> class Something {
> private $daten;
> public function __get ($eigenschaft) {
> if (isset ($this->daten[$eigenschaft]))
> return $this->daten[$eigenschaft];
> else
> return FALSE;
> }
> public function __set ($eigenschaft, $wert) {
> $this->daten[$eigenschaft] = $wert;
> }
> }

Knnste ja mal fix umstriken damit Du evtl siehst was gemeint ist. Der
obige Code sollte bereits alles sagen:

class A
{
private $daten = array();
public function __get($propname) {
if (isset($this->daten[$propname]))
return $this->daten[$propname];
else
throw new Exception("Property '{$propname}' dont exists!");
}
public function __set($propname, $wert) {
$this->daten[$propname] = $wert;
}
}

$a = new A();
$a->X = 20;
echo $a->X;
echo $a->Y; // Exception da nicht definiert im internen Array $daten

> Also sobald ich mein Array vorher deklariere?
>
> $daten['name'];
> $daten['vorname'];

Nee Du greifst doch ueber $this->daten auf das Array zu, was im Objekt
bereits enthalten ist.

> Oder werden die Methoden nicht aufgerufen sobald ich ein Attribut direkt
> in der Klasse deklariere?

So ist es.

MfG, Ulf