phpbar.de logo

Mailinglisten-Archive

[php] Overloading in PHP 5

[php] Overloading in PHP 5

David Molineus david at molineus.de
Son Dez 5 14:46:05 CET 2004


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