Comment utiliser une class dans une autre class?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

14 oct. 2008, 19:59

Bon, katagoto, c'est ta 3eme intervention que je lis aujourd'hui et une 3eme pour dire n'importe quoi ...

Il faudrait peut être tourner 7 fois ton clavier et réviser tes leçons maintenant.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 451 Messages

14 oct. 2008, 20:35

Je m'en doute que __call() n'a rien à faire dans se sujet.

Bref. Je voulais utiliser __autoload() car ma class extends déjà une autre class et que j'aurais voulu en mettre une 3eme.

Exemple:
class A extends B
{
       function __autoload()
      {
          require_once 'class_C.php';
      }

      function __construct()
      {
          $c = new C();
          // Ou
          $c = C::mafonction();
      }
} 

class B extends D {}
class C {}
class D {}
Cela m'aurais évité que je fasse extends C à la class D et de faire plein de fonction parent::function(); dans toutes mes class hors que seule la class A en a besoin d'autre en auront besoin aussi mais le principe sera le même.

Voilà pourquoi.

Mammouth du PHP | 19672 Messages

15 oct. 2008, 07:50

djtec, tu mélanges les problèmes et surtout tu ne sembles pas avoir correctement saisi à quoi sert d'étendre une classe. Si la classe B étend la classe A, c'est parce que la classe A est un peu plus générique, la classe B apportant un niveau supplémentaire de spécialisation. Le fait d'utiliser ou non __autoload() ne change strictement rien à l'affaire, ça n'a aucun rapport.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 1668 Messages

15 oct. 2008, 12:51

Bon, katagoto, c'est ta 3eme intervention que je lis aujourd'hui et une 3eme pour dire n'importe quoi ...

Il faudrait peut être tourner 7 fois ton clavier et réviser tes leçons maintenant.
J'ai eu 7 interventions sur ce topic, dont 3 inéxacte, et une inutile,

ensuite, si, __call à à voir dans l'histoire, il veut cumuler les méthodes, PHP ne permettant d'étendre une classe qu'à un seul parrent, avec __call il pourra appelé, si elle existe, une fonction d'une classe externe, certes c'est du bidouillage, mais je répond à son problème, tout du moins, je corrige un peu la manière dont il tentait de le résoudre, inclure une classe en plain milieu d'une autre, c'est plus du bidouillage

PS : merci zeus (pour l'autre topic), je ne savait plus quoi mettre dans ma signature ;)
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Eléphant du PHP | 451 Messages

15 oct. 2008, 18:31

Cyrano, je pensais que en déclarant la class charger avec __autoload() dans la fonction construct de cette manière:
      function __construct()
      {
          $c = new C();
      }
On pourrait l'utiliser ensuite

Mammouth du PHP | 19672 Messages

15 oct. 2008, 18:48

Dans un certain sens, tu as raison. Mais ce n'est pas dû à l'extension de classe.

Supposons que tu aies un fichier avec une fonction _autoload() qui est chargée avant tout autre chose au départ : à partir de ce moment là, si tu as correctement défini ce qui doit être fait dans cette fonction, tu pourras parfaitement faire ça dans n'importe quelle classe avec n'importe quelle autre classe. C'est pour ça que je suggérais d'élaborer le système qui charge les classes à la demande dans l'__autoload().

Ceci dit, ton exemple de code n'est pas top : si tu as besoin d'un objet externe dans une classe, mets-le en propriété, par exemple :
<?php
class A
{
    public function __construct()
    {
        //...
    }
}

class B
{
    private $c;
    
    public function __construct()
    {
        $this->c = new A();
    }
}
De cette manière, ton objet B::c est accessible dans toutes les méthodes de ta classe B et devient en réalité une propriété de la classe B.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 451 Messages

15 oct. 2008, 18:53

Ah ok Ben merci Cyrano celà vas arranger tout mes problèmes. :D

Par contre pour utiliser une fonction de la class C dans B je fais ceci???
class B
{
    private $c;
    
    public function __construct()
    {
        $this->c = new A();
    }

    public function test()
    {
        $this->c->mafonctionA();
    }
}
Où dois-je faire autrement???

Mammouth du PHP | 19672 Messages

15 oct. 2008, 18:55

C'est tout à fait ça :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 451 Messages

15 oct. 2008, 19:12

Cool merci à tous et merci Cyrano pour la solution que je cherchais depuis le début du moins je pensais à une chose qui n'était pas tout à fait bon mais bon maintenant je pense avoir compris d'autre chose.

[Sujet réglé]

++

ViPHP
ViPHP | 4674 Messages

15 oct. 2008, 20:06

Pour info', c'est ce que j'avais abordé au début, à savoir une association.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 451 Messages

15 oct. 2008, 20:25

Toutes mes excuses HyWaN je n'avais pas compris que tu me parlais d'un code comme ceci.
:? :? :? :?

ViPHP
ViPHP | 4674 Messages

15 oct. 2008, 20:45

En fait j'avais proposé plusieurs solutions et je voulais que tu les approfondisses toutes. Mais c'est pas grave ;-), tu as déjà pas mal vadrouillé, et tu as déjà saisie un peu les associations :).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 451 Messages

15 oct. 2008, 20:57

Oui j'ai compris plusieurs chose en faites grâce à vous tous.