Strict standard sur la signature d'une fonction

ViPHP
ViPHP | 928 Messages

08 févr. 2012, 11:54

Bonjour à tous,
quelqu'un saurait pourquoi j'obtiens une stricte standard sur le code suivant, ça me paraît pourtant évident d'utiliser la surcharge de cette façon :
error_reporting(E_ALL | E_STRICT);

class papa
{
	public function test($a)
	{
		echo $a;
	}
}

class enfant extends papa
{
	public function test()
	{
		parent::test(42);
	}
}

Code : Tout sélectionner

Strict standards: Declaration of enfant::test() should be compatible with that of papa::test() in D:\wamp\www\dev\index.php on line 44
Merci !

ViPHP
xTG
ViPHP | 7331 Messages

08 févr. 2012, 12:04

Bug connu et répertorié apparemment : https://bugs.php.net/bug.php?id=46851

Mais après cela me semble un brin logique pour PHP.
Il ne permet pas la surcharge de méthode au sein d'une même class.
Exemple impossible en PHP :
class Test{
	public function test(){}
	public function test($a,$b){}
}
Je suis donc même étonné qu'il ne te sorte pas plutôt une fatal error comme pour le code que je te propose qui est pourtant la même chose.

ViPHP
ViPHP | 928 Messages

08 févr. 2012, 12:24

Salut,
pourtant je ne surcharge pas la méthode dans la même classe, je surcharge simplement la méthode parente dans une classe fille 8-|

J'avoue ne pas comprendre cette "limitation", c'est certes simplement une stricte standard qui est lâchée, mais dans mon cas ça me pourri mes logs :o

Mammouth du PHP | 568 Messages

08 févr. 2012, 12:27

Bonjour à tous,
quelqu'un saurait pourquoi j'obtiens une stricte standard sur le code suivant, ça me paraît pourtant évident d'utiliser la surcharge de cette façon :
error_reporting(E_ALL | E_STRICT);

class papa
{
	public function test($a)
	{
		echo $a;
	}
}

class enfant extends papa
{
	public function test()
	{
		parent::test(42);
	}
}

Code : Tout sélectionner

Strict standards: Declaration of enfant::test() should be compatible with that of papa::test() in D:\wamp\www\dev\index.php on line 44
Merci !
La même signature signifie que la méthode doit posséder le même nombre d'argument, hors dans ta class child tu n'a pas de paramètre...

ViPHP
xTG
ViPHP | 7331 Messages

08 févr. 2012, 12:32

Salut,
pourtant je ne surcharge pas la méthode dans la même classe, je surcharge simplement la méthode parente dans une classe fille 8-|

J'avoue ne pas comprendre cette "limitation", c'est certes simplement une stricte standard qui est lâchée, mais dans mon cas ça me pourri mes logs :o
Bah c'est la même chose en objet parent ou même class...
Une surcharge est une surcharge et PHP ne l'implémente pas entièrement. Peut être plus tard quand il gérera correctement le typage d'argument.
Tu peux même considérer que le fait de ne générer qu'une erreur strict est un bug.
Il devrait te claquer une fatal et point barre. :P

ViPHP
ViPHP | 928 Messages

08 févr. 2012, 16:08

Tu as surement raison, je n'ai pas assez de connaissance dans l'héritage des autres langages pour voir en quoi PHP serait peut être trop permissif, ça me paraissait juste naturel en fait :P

Merci :)

ViPHP
xTG
ViPHP | 7331 Messages

08 févr. 2012, 16:41

Non justement, ton raisonnement était tout à fait valable.
C'est PHP qui n'a pas implémenté la surcharge comme on pouvait l'attendre d'un langage objet.
Donc sur ce coup là c'est pas être permissif au contraire.
Je dirais même que c'est bordélique car on génère deux niveaux d'erreur totalement différent (l'un en warning strict et l'autre en fatal qui est totalement bloquant) pour la même opération.