PHP-Entwicklung
Posts 1-10 of 19
- Back
- Next
-
Martin Schäpker Premium MemberThe 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?
- 27 Jul 2009, 5:26 pm
-
Post visible to registered members
-
Johannes SchlüterThe 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.
- 27 Jul 2009, 5:45 pm
-
Martin Schäpker Premium MemberThe 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 ;-)
- 27 Jul 2009, 5:49 pm
-
Ulf KirstenThe 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
- 28 Jul 2009, 12:28 pm
-
Roland Wilczek Premium MemberThe 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.
- 28 Jul 2009, 3:32 pm
-
Ulf KirstenThe 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
- 29 Jul 2009, 07:40 am
-
Post visible to registered members
-
Jens Weller Premium Member Group moderatorThe 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.
- 08 Aug 2009, 5:05 pm
-
Martin Schäpker Premium MemberThe 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.- 08 Aug 2009, 6:11 pm
- Back
- Next
