Comment utiliser une class dans une autre class?

Eléphant du PHP | 451 Messages

12 oct. 2008, 10:43

Bonjour,

Voilà j'ai 4 class php:
class A
class B
class C
class D

La class A extends avec C, la class B extends avec C.
Pour utiliser la fonction de la class C dans la class A il faut utiliser parent::nom_de_la_fonction.

Comme ceci:
<?php

class A extends C
{
	function exempleA()
	{
		echo 'exemple A';
		parent::exempleC()
	}
}

class B extends C
{
	function exempleB()
	{
		echo 'exemple B';
	}
}

class C
{
	function exempleC()
	{
		echo 'exemple C';
	}
}

class D
{
	function exempleD()
	{
		echo 'exemple D';
	}
}

?>
Mais maintenant si je veux utiliser une fonction de la class D dans la class A comme faut-il faire?

Merci d'avance.

ViPHP
ViPHP | 5924 Messages

12 oct. 2008, 10:53

Mais maintenant si je veux utiliser une fonction de la class D dans la class A comme faut-il faire?

Merci d'avance.
Tu peux pas…
L'héritage multiple n'existe pas en php. Si tu veux que la méthode de ta classe D existe automatiquement dans ta classe C, il faut qu'elle soit présente dans une des classes en amont…

Eléphant du PHP | 451 Messages

12 oct. 2008, 11:29

Il n'y a pas un autre moyen que l'héritage?

ViPHP
ViPHP | 5924 Messages

12 oct. 2008, 12:08

Bah à part copier le code de la classe D dans la classe A, non…

Eléphant du PHP | 451 Messages

12 oct. 2008, 12:13

C'est bien ce que je pensais mais je me suis dit qu'il y avait peut-être une solution quand même car ma class D sera utilisé par plusieurs class et je voulais éviter de mettre plusieurs fois la même fonction dans plusieurs class mais vu qu'il y a pas le choix je vais recopier partout ou j'en ai besoin.

Merci Sékiltoyai.

ViPHP
ViPHP | 4674 Messages

12 oct. 2008, 13:13

Hey :),

Tu as trois solutions qui s'offrent à toi.
La première est que C hérite de D. Comme ça, D fait partie de la famille de classe, et tu peux y accéder depuis A ou B.
La seconde est que C, A ou B contiennent D. C'est à dire que les objets contiennent une instance de D.
Enfin, la dernière solution (et de loin la plus mauvaise) est de recopier ta méthode partout où tu en as besoin, mais on perd tout l'intérêt de l'objet …

La première solution met en avant la notion de famille, de groupe ou de catégorie. Si D propose des fonctionnalités qui vont dans le même sens que C, A ou B, alors il peut faire partie de cette famille.

La seconde solution met en avant la notion d'association (et a fortiori d'agrégation et composition). C'est peut-être un peu compliqué de l'expliquer simplement, en quelques lignes, mais qu'on me pardonne, je m'y essaye. En gros, une association symbolise un lien entre deux classes. Si D propose des fonctionnalités qui sont différentes de ce que C, A ou B proposent, D ne fait pas partie de la famille. En revanche, C, A ou B ont besoin de D pour leur bon fonctionnement, il y a un donc un lien entre tout ce petit monde. Maintenant, si on parle d'agrégation, c'est une notion plus forte que l'association. Elle va dans le même sens, mais est plus forte. D est juste une classe dans laquelle on a délégué du travail annexe, qui ne faisait pas vraiment partie de C, A ou B. C'est comme une sorte d'annexe évolué, que tout le monde peut utilisé. En effet, D fait beaucoup de travail et on l'a suffisamment rendu générique pour être bénéfique dans d'autres contextes, dans d'autres utilisations. Et enfin, la composition est une notion plus forte que l'agrégation. C'est toujours un lien entre deux classes, mais c'est un lien qui n'est pas partagé. Si D compose C, alors D n'appartient qu'à C, et à elle seule. Seule C peut accéder à D, c'est la grande notion de la composition. On peut aussi parler de durée de vie, mais c'est une notion peut parlante pour une première rencontre avec la composition :).

Je n'ai pas formalisé les définitions volontairement. Mais ce que tu dois essayer de comprendre, c'est que ton problème n'a pas une unique solution. La solution dépend de la nature des classes, de leur travail etc.
« 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

12 oct. 2008, 15:47

J'ai enlevé le tag résolu vu la réponse de HyWaN et merci de celle-ci.

Donc HyWaN tu me dis de faire comme ceci si j'ai compris:
<?php

class A extends C
{
    function exempleA()
    {
        echo 'exemple A';
        parent::exempleC();
		parent::variableD();
    }
}

class B extends C
{
    function exempleB()
    {
        echo 'exemple B';
    }
}

class C extends D
{
    function exempleC()
    {
        echo 'exemple C';
    }
	
	function variableD()
	{
		parent::exempleD();
	}
}

class D
{
    function exempleD()
    {
        echo 'exemple D';
    }
}

?> 
Mais une chose vient de me traverser l'esprit.

Si j'utilise les variables global ne serait-ce pas mieux que parent car avec global je pourrais utiliser les fonctions de la class D ou je le désire.

Mais quelle est la différence entre global et parent???

Mammouth du PHP | 1668 Messages

12 oct. 2008, 16:24

global, c'est pour récupérer une variable globale dans une fonction
parrent appel une fonction ou un attribut de la classe mère...
"À 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

12 oct. 2008, 16:50

Et le mieux ça serait que j'utilise global ou parent car ma class D est une classe de sécurisation de donnés.

Mammouth du PHP | 1668 Messages

12 oct. 2008, 17:46

ça ne marche pas ce que tu as fais là ?
"À 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

12 oct. 2008, 17:49

Si cela fonctionne mais je voulais savoir quel serait la meilleur méthode entre global et parent

Mammouth du PHP | 1668 Messages

12 oct. 2008, 17:59

Parent, si la fonction vient par héritage, si non...tu as deux solutions, soit c'est une fonctione indépendante d'une classe et là tu l'appel normalement, soit elle appartient à un objet et là, si tu veux pas avoir à l'instancier tu passe la méthode en static, global ne marche que pour les variables
"À 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

12 oct. 2008, 18:45

Et comment fonctionne la méthode static?

Mammouth du PHP | 1668 Messages

12 oct. 2008, 20:08

<?php
MaClasse
{
    static function MaMethode($pseudo) { echo "Bonjour <b>$pseudo</b>, ça va ?";}
}

MaClasse::MaMtehode("djtec");
Voilà en gros, on instancie pas d'objet, on se sert juste de la classe comme "namespace", même si un namespace et modifiable directement...
"À 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

12 oct. 2008, 20:42

Donc je pourrais faire ceci?
<?php
class D
{
    static function exempleD($pseudo) { echo "Bonjour <b>$pseudo</b>, ça va ?";}
}

class A extends B
{
    public function exempleA()
   {
       D::exempleD("pseudo");
   }
}
?>