Page 1 sur 3

Comment utiliser une class dans une autre class?

Posté : 12 oct. 2008, 10:43
par djtec
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.

Re: Comment utiliser une class dans une autre class?

Posté : 12 oct. 2008, 10:53
par Sékiltoyai
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…

Posté : 12 oct. 2008, 11:29
par djtec
Il n'y a pas un autre moyen que l'héritage?

Posté : 12 oct. 2008, 12:08
par Sékiltoyai
Bah à part copier le code de la classe D dans la classe A, non…

Posté : 12 oct. 2008, 12:13
par djtec
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.

Posté : 12 oct. 2008, 13:13
par Hywan
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.

Posté : 12 oct. 2008, 15:47
par djtec
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???

Posté : 12 oct. 2008, 16:24
par katagoto
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...

Posté : 12 oct. 2008, 16:50
par djtec
Et le mieux ça serait que j'utilise global ou parent car ma class D est une classe de sécurisation de donnés.

Posté : 12 oct. 2008, 17:46
par katagoto
ça ne marche pas ce que tu as fais là ?

Posté : 12 oct. 2008, 17:49
par djtec
Si cela fonctionne mais je voulais savoir quel serait la meilleur méthode entre global et parent

Posté : 12 oct. 2008, 17:59
par katagoto
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

Posté : 12 oct. 2008, 18:45
par djtec
Et comment fonctionne la méthode static?

Posté : 12 oct. 2008, 20:08
par katagoto
<?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...

Posté : 12 oct. 2008, 20:42
par djtec
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");
   }
}
?>