(error:Cannot call abstract met)erreur de conception ou bug?

jcpans
Invité n'ayant pas de compte PHPfrance

26 mai 2010, 16:37

Bonjour,
Le code suivant :
abstract class Toto {
	public static abstract function test();
	
	public static function test2() {
		self::test();
	}
}
 
class Titi extends Toto {
	public static function test() {
		echo 'dans la classe Titi';
	}
}
 
Titi::test2();
Provoque l'erreur suivante
Fatal error: Cannot call abstract method Toto::test() in ...
Je suis sous PHP 5.3.1, est ce que c'est une erreur de conception ou un bug ?


Merci d'avance

ViPHP
ViPHP | 5462 Messages

26 mai 2010, 16:40

met toi en erreur E_ALL | E_STRICT et tu comprendras :wink:

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

26 mai 2010, 16:41

Ton erreur vient de là :

Code : Tout sélectionner

self::test();
Tu viens de déclarer test() en méthode abstraite et tu l'appelles :) erreur de conception.
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

ViPHP
ViPHP | 5462 Messages

26 mai 2010, 16:43

Ton erreur vient de là :

Code : Tout sélectionner

self::test();
Tu viens de déclarer test() en méthode abstraite et tu l'appelles :) erreur de conception.
Strict Standards: Static function Toto::test() should not be abstract
:wink:

jcpans
Invité n'ayant pas de compte PHPfrance

26 mai 2010, 16:47

merci
met toi en erreur E_ALL | E_STRICT et tu comprendras :wink:
rien ne change

jcpans
Invité n'ayant pas de compte PHPfrance

26 mai 2010, 16:48

Ton erreur vient de là :

Code : Tout sélectionner

self::test();
Tu viens de déclarer test() en méthode abstraite et tu l'appelles :) erreur de conception.
oui je l'ai implémenté dans le classe class Titi.

ViPHP
ViPHP | 5462 Messages

26 mai 2010, 16:48

merci
met toi en erreur E_ALL | E_STRICT et tu comprendras :wink:
rien ne change

si ca te dis que tu peux pas faire du abstract sur une function static

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

26 mai 2010, 16:49

Strict Standards: Static function Toto::test() should not be abstract
Moui mais jcpans aurait pu croire que son utilisation des méthodes abstraites et de l'héritage était incorrect avec juste le message d'erreur. Alors que le souci ne concerne pas l'héritage du tout.

Si tu es en PHP 5.2, c'est pas possible de cumuler abstract et static. (source : h[url]ttp://php.net/manual/fr/migration52.incompatible.php[/url])
En PHP 5.3 cela change de nouveau :D

Sinon, on peut p-ê t'aider en conception ?
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

ViPHP
ViPHP | 5462 Messages

26 mai 2010, 17:01

Si tu es en PHP 5.2, c'est pas possible de cumuler abstract et static. (source : h[url]ttp://php.net/manual/fr/migration52.incompatible.php[/url])
En PHP 5.3 cela change de nouveau :D
non c'est pareil :roll:

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

26 mai 2010, 17:03

:roll:
Cela dit stealth35, peux tu lui expliquer pourquoi c'est une erreur de conception ?
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

26 mai 2010, 17:07

Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

ViPHP
ViPHP | 5462 Messages

26 mai 2010, 17:18

:roll:
Cela dit stealth35, peux tu lui expliquer pourquoi c'est une erreur de conception ?
oui, parce que self déjà c'est uniquement la classe ou il est définie, et en plus on appelle pas un méthode abstraite définie dans la même classe

si tu veux faire ton truc ca serait
interface iToto
{
    public static function test();
}
    
abstract class  Toto implements iToto
{           
    public static function test2()
    {
        $class = get_called_class();
        $class::test();
    }
}
     
class Titi extends Toto
{
    public static function test()
    {
        echo 'dans la classe Titi';
    }
}
    
Titi::test2();
//dans la classe Titi

jcpans
Invité n'ayant pas de compte PHPfrance

26 mai 2010, 17:29

meri à tous
@stealth35 j'ai posté la reponse sur developpez

jcpans
Invité n'ayant pas de compte PHPfrance

26 mai 2010, 17:32

dites y a t il des tuts à lire pour ne plus faire ce genre d'erreur ?

ViPHP
ViPHP | 5462 Messages

26 mai 2010, 17:36

dites y a t il des tuts à lire pour ne plus faire ce genre d'erreur ?
tu peux déjà commencer par ca : http://fr2.php.net/manual/fr/language.oop5.php

tien d'ailleurs en lisant la on peux faire direct avec "static" exemple 2 (http://fr2.php.net/manual/fr/language.o ... ndings.php)
du coup
abstract class Toto implements iToto
{           
    public static function test2()
    {
        static::test();
    }
}