PHP constructor : regression ?
+
Par Remi le dimanche 7 septembre 2008, 18:33 - General - Lien permanent
With the new PHP 5.3.0 I've notice a regression in the constructor calls. You cannot call a not defined constructor using the PHP 4 syntaxe (the constructor has the class name) while you can until php 5.2.6 (the parent constructor is called).
You can read the message I've posted on PHP Internals ML.
Avec la nouveau PHP 5.3.0, j'ai remarqué une régression dans l'appel des constructeurs. Vous ne pouvez pas appeler un constructeur qui n'est pas définit avec la syntaxe de PHP 4 (le constructeur porte le nom de la classe) alors que c'était possible jusque php 5.2.6 (le constructeur de la classe parent est appelé).
Un petit exemple :
<?php
class testA {
function testA () {
echo "from Class A\n";
}
}
class testB extends testA {
}
class testC extends testB {
function testC () {
parent::testB();
echo "from Class C\n";
}
}
echo "PHP Version : " . phpversion() . "\n";
$toto = new testC();
?>
Avec PHP 5.2.6 vous obtenez :
PHP Version : 5.2.6
from Class A
from Class C
Avec PHP 5.3.0 vous obtenez une erreur :
PHP Version : 5.3.0alpha3-dev
PHP Fatal error: Call to undefined method testB::testB() in ...
Il est possible de créer un constructeur pour la classe testB, mais la bonne solution consiste à utiliser la syntaxe de PHP 5 :
<?php
class testA {
function __construct () {
echo "from Class A\n";
}
}
class testB extends testA {
}
class testC extends testB {
function __construct () {
parent::__construct();
echo "from Class C\n";
}
}
echo "PHP Version : " . phpversion() . "\n";
$toto = new oldC();
?>
Cependant, il s'agit visiblement d'une régression qui peut poser des problèmes avec des applications prévues pour fonctionner en PHP 4 et 5 (GLPI par exemple)
Bien entendu, j'ai signalé le problème au projet, sur la liste de diffusion "PHP Internals", j'attends des retours éclairés sur ce sujet.