Mailinglisten-Archive |
Hallo PHP-Liste, ich habe gerade etwas mit PHP 5 und dem Overloading-Feature herumgespielt, und dabei eigenartige Ergebnisse erzielt. Angenommen, ich habe folgendes Objekt, wird eine Fehlermeldung erzeugt: class Object { protected $parent; function __set($name, $value) { if($name == 'parent') { $this->parent = $value; } } } $obj = new Object(); // Erzeugt Fehlermeldung: // Fatal error: Cannot access protected property Objekt::parent ... $obj->parent = new Object(); Anscheinend, überprüft PHP erst, ob die Eigenschaft im geschützten Bereich existiert und erzeugt sogleich eine Fehlermeldung bevor das Vorhandensein von __set($n, $v) überprüft wird. Hat jemand von euch eine ähnliche Erfahrung gemacht? Ist dies ein Bug oder wird das als Feature angesehen? Wenn dies gewollt ist, ist für mich Overloading nicht verwendbar. Angenommen man hat eine Template-Klasse, wo man durch $tpl->var = 'x'; und Overloading die Variablen in ein Array speichern lässt, dann aber noch weitere geschützte Variablen hat, z.B. file kann es immer zu unvorhersehbaren Fehlern kommen, wenn man diese Variablen auch in seinem Template verwendet: class Template { protected $vars = array(); protected $file = null; function __construct($file = null) { $this->file = $file; } function setFile($file) { $this->file = $file; } function display() { //... } function __set($name, $value) { $this->vars[$name] = $value; } } $tpl = new Template('index.tpl'); $tpl->name = 'Homepage'; // wird funktionieren $tpl->vars = array(1, 2, 3, 4); // Konflikt $tpl->file = 'index.tpl'; // Konflikt Ein weiteres weiteres Problem tritt bei mir unter Windows 2000 mit Apache 2 auf, wenn ich __call($m, $a) verwenden will. Dann erzeugt der Apache einen Speicherfehler. Gruß David
php::bar PHP Wiki - Listenarchive