IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

static appelle classe soeur


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 30
    Points : 25
    Points
    25
    Par défaut static appelle classe soeur
    Bonjour j'ai un problème que je ne comprend pas que voici exposé du mieux que je peux:
    J'ai 4 classes que je vais nommer General, Arbre, Element1 et Element2
    Element1 et Element2 sont en gros des éléments d'une structure arborescente, filles d'une classe Arbre, elle même fille d'une classe General.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    class General{
    function coucou()  //coucou() n'est pas statique
    {
    return static::coucou;
    }
    }
    class Arbre extends General {
    function getLienCreeFils($type){
    switch ($type){
    case "Element1": return Element1::coucou();
    break;
    case "Element2": return Element2::coucou();
    break;
    }
    }
    }
    class Element1 extends Arbre {
    const coucou="coucou1";
    }
    class Element2 extends Arbre {
    const coucou="coucou2";
    }
    Donc, j'ai le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $elem=new Element1();
    $elem->getLienCreeFils("Element2");
    J'aimerais recevoir comme réponse "Element1", mais je reçois "Element2".
    Et j'avoue ne pas comprendre du tout la raison:
    Ai-je raté quelque chose? Est-ce un bug php? Ai-je mal compris la notion de static:
    Pour résoudre mon problème de manière temporaire, j'ai fait un truc horrible ci dessous (j'ai instancié la classe au lieu d'appeler la méthode statiquement, ce qui par un miraculeux hasard règle le problème), mais si vous pouviez m'aider à le résoudre de manière définitive, cela m'arrangerait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    class Arbre extends General
    {
    function getLienCreeFils($type)
    {
    <div style="margin-left:40px">switch ($type)
    {
    case "Element1": 
    return Element1::coucou();
    break;
    case "Element2": 
    $objetBidon=new Element2();
    return $objetBidon->coucou();
    //case "Element2": return Element2::coucou();
    break;
    }</div>}
    }
    Cordialement,
    Marc

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    C'est étrange, mis à part que cette hiérarchie d'héritage est un peu particulière, c'est pourtant censé fonctionner.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    class foo {
     
        public static function getConst () {
            return static::constant;
        }
     
    }
     
    class bar extends foo {
     
        public static function getConstOf ($class) {
            return $class::getConst();
        }
    }
     
    class a extends bar { const constant = "a"; }
    class b extends bar { const constant = "b"; }
     
    var_dump( a::getConstOf('b') ); // b
    var_dump( b::getConstOf('a') ); // a
     
    $a = new a;
    $b = new b;
     
    var_dump( $a->getConstOf('b') ); // b
    var_dump( $b->getConstOf('a') ); // a
    Comme on peut le remarquer, l'usage d'une méthode dans un contexte de classe ou d'instance n'a pas d'influence sur la valeur obtenue.

    Comment as-tu fait tes tests ?

    Et pourquoi as-tu besoin de mettre les mains dans le late static binding ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 30
    Points : 25
    Points
    25
    Par défaut Un peu plus d'information et une manière de résoudre mais toujours des questions
    Bonjour et merci Benjamin de t’intéresser à ma question.
    Pour répondre à tes questions, je n'utilise pas d'outils de test. J'ai un simple éditeur notepad++ (si c'est bien ta question).
    Pour le late state binding: Je m'en sert pour gérer des url de pages de creation de classe.
    J'ai étudié un peu plus en détail mon problème et j'ai extrait de mon code l’exacte structure qui pose des problèmes en retirant tout ce qui ne touche pas à celui ci.
    Le code ci dessous rejoue exactement le même problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    abstract class ClasseSommet 
    {
    	function getUrlSommet()
    	{
    		return static::getUrlPage();
    	}
    }
    abstract class ElementArborescence extends ClasseSommet
    {
    	function afficherLienCreationfils($type)
    	{
    		$urlPageDirect=$type::pageCreation;
    		print("<br/>$type :urlPage en direct : $urlPageDirect");
    		$urlPageMethStatic=$type::getUrlSommet();	
    		print("<br/>$type :urlPage par méthode $type::getUrlSommet(): $urlPageMethStatic");
    	}
    	function getUrlPage()
    	{
    		return static::pageCreation;
    	}
    }
    class Decoupage extends ElementArborescence
    {
    	const pageCreation="creation_decoupage.php";
    }
    class Produit extends ElementArborescence
    {
    	const pageCreation="creation_produit.php";
    }
     
    $branche=new Decoupage();
    $branche->afficherLienCreationfils("Decoupage");
    $branche->afficherLienCreationfils("Produit");
    Le résultat affiché est :
    Decoupage :urlPage en direct : creation_decoupage.php
    Decoupage :urlPage par méthode Decoupage::getUrlSommet(): creation_decoupage.php
    Produit :urlPage en direct : creation_produit.php
    Produit :urlPage par méthode Produit::getUrlSommet(): creation_decoupage.php
    A noter le phénomène suivant: Si je remplace $branche=new Decoupage(); par $branche=new Produit(); le problème s'inverse.
    Par ailleurs, je viens de m'apercevoir que le fait de passer la méthode ClasseSommet::getUrlSommet() en statique résoud le problème. Mon souçis est que cela ne m'arrange pas pour des raisons connexes dans le projet. Si on ne trouve pas d'autre moyen, c'est ce que je ferai au final, mais je ne comprend pas pourquoi cela est nécessaire.
    Si vous pouvez m'éclairer....
    Marc

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    le late static binding comme son nom l'indique ne s'applique qu'aux constantes et aux méthodes statiques. Quand tu exécutes pas à pas ton code, PHP se met à couiner :
    Non-static method ClasseSommet::getUrlSommet() should not be called statically, assuming \$this from incompatible context
    L'utilité du late static binding réside dans ses capacité de factorisation de code à travers une hiérarchie de classes dérivées.
    En gros : tu codes tes fonctions dans la classe mère et les fonctions vont chercher le paramétrage nécessaire à leur exécution dans les classes enfants avec static:: qui permet d'atteindre le contexte enfant à l'exécution.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 30
    Points : 25
    Points
    25
    Par défaut
    Ok, merci pour ta réponse.
    En fait ma méthode est utilisée alternativement en mode statique ou non statique. Je vais donc me débrouiller pour découper cela en deux pour séparer les cas d'utilisation statiques et non statiques.
    A bientôt,
    Marc

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Je ne vois pas trop comment tu comptes découper tes URL en classes (m'est d'avis que tu vas arriver très vite à une usine à gaz)
    Sans compter le monde statique et dynamique entre-mêlés...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. appel class static & namespace
    Par HeB91 dans le forum Développement Web avec .NET
    Réponses: 10
    Dernier message: 04/12/2013, 16h29
  2. [PHP 5.3] Appel d'une méthode d'une classe soeur
    Par Aldéhir dans le forum Langage
    Réponses: 5
    Dernier message: 21/06/2009, 03h59
  3. appel classe Main d'un projet dans une classe
    Par yannard dans le forum Langage
    Réponses: 3
    Dernier message: 27/02/2008, 11h27
  4. Réponses: 13
    Dernier message: 15/11/2005, 15h47
  5. pointeur membre static de classe
    Par Ca$ul dans le forum C++
    Réponses: 3
    Dernier message: 26/08/2004, 13h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo