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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : (error:Cannot call abstract met)erreur de conception ou bug?

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

par huit_six » 26 mai 2010, 18:04

J'ai une classe abstraite qui contient des méthodes (implémentées) qui reposent sur des méthodes des implémentations concrètes. Ça me permet de factoriser dans la classe abstraite des algorithmes suivis par toutes les implémentations, en abstrayant certains détails d'implémentation que seules les classes concrètes peuvent connaitre, en gros c'est le DP "patron de méthode". Comme aucune de ces méthodes n'a de lien avec les instances en particulier, il m'a semblé logique de les rendre static.

Est-ce que je fais une erreur de raisonnement ?

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

par mere-teresa » 26 mai 2010, 17:59

Là, je peux comprendre le static mais pkoi l'abstract ?
(oui je pose des questions mais j'aimerais vraiment comprendre).

Sinon, j'ai trouvé des explications sur : http://stackoverflow.com/questions/9990 ... ss-methods

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

par stealth35 » 26 mai 2010, 17:56

Mais pourquoi veux-tu faire cela ?
(j'ai cru comprendre que dans les autres langages, ce n'était pas non plus possible.)
pour ma part j'avais fais ca dans l'optique d'un MVC par exemple pour récupérer toutes les valeurs

User::getAll();
Info::getAll();

au lieux de faire

$user = new User();
$user->getAll();

$info = new Info();
$info->getAll();

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

par mere-teresa » 26 mai 2010, 17:53

Mais pourquoi veux-tu faire cela ?
(j'ai cru comprendre que dans les autres langages, ce n'était pas non plus possible.)

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

par stealth35 » 26 mai 2010, 17:51

je comprend.

tu peux créer la fonction get_called_class() si tu veux (mais bon c'est la bidouille)

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

par huit_six » 26 mai 2010, 17:45

Je suis l'auteur original du post sur dvp, je rejoins ici la discussion.

Bon mon post a failli croiser les derniers, il semble donc que ce soit bien prévu dans php 5.3, ça me parait bizarre de ne pas avoir donné directement ce comportement à self et d'avoir créé static:: plutôt car le comportement n'est pas cohérent avec celui de this. Mais bon...
En gros, je vais patienter avec mes méthodes non static qui devraient l'être, jusqu'à ce qu'online.net décide de mettre à jour sa version de php, ou qu'on change d'hébergeur...

Merci beaucoup à tous de votre aide

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

par stealth35 » 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();
    }
}

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

par jcpans » 26 mai 2010, 17:32

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

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

par jcpans » 26 mai 2010, 17:29

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

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

par stealth35 » 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

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

par mere-teresa » 26 mai 2010, 17:07

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

par mere-teresa » 26 mai 2010, 17:03

:roll:
Cela dit stealth35, peux tu lui expliquer pourquoi c'est une erreur de conception ?

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

par stealth35 » 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:

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

par mere-teresa » 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 ?

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

par stealth35 » 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