PHP-Entwicklung

PHP-Entwicklung

Posts 1-10 of 19
  • Martin Schäpker
    Martin Schäpker    Premium Member
    The company name is only visible to registered members.
    __get() hebelt private aus
    hallo

    Mit ist aufgefallen das sobald man die __get() Methode implemeniert ein Zugriff auf als private deklarierte Variablen möglich ist.

    class test{

    private $nooutput='test';

    function __get($name)
    {
    return $this->$name;
    }

    function __isset($name)
    {
    return isset($this->$name);
    }
    }

    $test=new test();
    var_dump(isset($test->nooutput)); // boll(true)
    echo $test->nooutput; // test

    dies stellt in meinen Augen ein inkonsitentes Verhalten von php dar, oder irre ich mich?
  • Post visible to registered members
  • Johannes Schlüter
    Johannes Schlüter
    The company name is only visible to registered members.
    Re: __get() hebelt private aus
    Es wäre wohl eher schlimm, wenn man aus einer __get()/__set/__call()/.. keinen Zugriff auf private Elemente hätte .. sobald man Zugriff drauf hat ist man selber Verantwortlich wie man den nutzt ... und oben gezeigter Code kann ja z.B. genutzt werden um read-only-Properties zu simulieren.
  • Martin Schäpker
    Martin Schäpker    Premium Member
    The company name is only visible to registered members.
    Re^2: __get() hebelt private aus
    class test{

    private $nooutput='test';

    function __get($name)
    {
    return $this->$name;
    }

    function __isset($name)
    {
    return isset($this->$name);
    }

    function __set($name,$val)
    {
    $this->$name=$val;
    }
    }

    $test=new test();
    var_dump(isset($test->nooutput));//bool(true)
    echo $test->nooutput; // test
    $test->nooutput='tete';
    echo $test->nooutput; //tete

    ok man muss es halt nur wissen ;-)
  • Ulf Kirsten
    Ulf Kirsten
    The company name is only visible to registered members.
    Re^3: __get() hebelt private aus
    Das Thema getter & setter geistert gerade recht aktuell in verschiedenen PHP-Blogs herum. Gut zusammengefasst wurde es imo hier: http://www.kingcrunch.de/blog/2009/07/23/setter-getter-publi... .

    Wie du schon festgestellt hast, simuliert man mit den magischen Methoden getter & setter. Ob man das nun mag oder nicht, sei mal dahingestellt. Es hat aber auf jeden Fall eine Daseinsberechtigung sonst würden es die verschiedenen PHP-Frameworks nicht alle einsetzen. Ich z.B. versuche __set fast nie einzusetzen, manchmal macht es aber auch Sinn vor allem in einer Basisklasse (so setzt es z.B. Doctrine um, um Zugriff auf die Attribute zu gewähren).

    Viele Grüße
    Ulf
  • Roland Wilczek
    Roland Wilczek    Premium Member
    The company name is only visible to registered members.
    Re^4: __get() hebelt private aus
    Ulf Kirsten schrieb:
    Es hat aber auf jeden Fall eine Daseinsberechtigung sonst würden es die verschiedenen PHP-Frameworks nicht alle einsetzen. [...] so setzt es z.B. Doctrine um, um Zugriff auf die Attribute zu gewähren
    Die verschiedenen PHP-Frameworks sind allein keine Rechtfertigung für bestimmte Implementierungen.
    Schon gar nicht Doctrine. Ich habe wirklich selten so üblen Quelltext gesehen wie gerade in diesem Monster.
  • Ulf Kirsten
    Ulf Kirsten
    The company name is only visible to registered members.
    Re^5: __get() hebelt private aus
    Roland Wilczek schrieb:
    Die verschiedenen PHP-Frameworks sind allein keine Rechtfertigung für bestimmte Implementierungen.
    Schon gar nicht Doctrine. Ich habe wirklich selten so üblen Quelltext gesehen wie gerade in diesem Monster.

    Dann schau dir einfach mal Wordpress an... ;)

    Der Einsatz von __get und __set-Methoden bei bekannten PHP-Frameworks soll auch keine Rechtfertigung für den eigenen Einsatz dieser Methoden sein. Es soll aber verdeutlichen, dass man zwangsläufig mit diesen magischen Methoden in Berührung kommen wird, wenn man sich ernsthaft mit PHP beschäftigt, da diese eben oft verwendet werden.

    Viele Grüße
    Ulf
  • Post visible to registered members
  • Jens Weller
    Jens Weller    Premium Member   Group moderator
    The company name is only visible to registered members.
    Re: __get() hebelt private aus
    Diese Getimplementation finde ich jirgendwie suboptimal.
    Da Objekte generell per Reference übergeben werden, ist der sinn von Gettern sowieso zweifelhaft.
    Ihre Implementation ist aber auch keineswegs abgesichert, evtl. sollte man den Input der __get Methode dann doch prüfen, ob man diese zurückgeben will.
  • Martin Schäpker
    Martin Schäpker    Premium Member
    The company name is only visible to registered members.
    Re^2: __get() hebelt private aus
    Wäre die Funktion protected oder public wäre dies eben nicht möglich.
    ich glaube hier war statt public private gemeint :-)

    aber es spielt keine rolle ob ich __get() private oder protected deklariere das verhalten bleibt das selbe

    class test{

    private $nooutput='test';

    private function __get($name)
    {
    return $this->$name;
    }

    private function __isset($name)
    {
    return isset($this->$name);
    }

    private function __set($name,$val)
    {
    $this->$name=$val;
    }
    }

    $test=new test();
    var_dump(isset($test->nooutput));//bool(true)
    echo $test->nooutput; // test
    $test->nooutput='tete';
    echo $test->nooutput; //tete
    This post was modified on 08 Aug 2009 at 06:13 pm.