Agrégation de classes

Mammouth du PHP | 881 Messages

29 avr. 2010, 08:17

Bonjour,

j'utilise la classe FPDF et je veux lui ajouter des fonctions en puisant dans des classes que j'ai trouvées. Tous les exemples données le sont par ajout d'une seule classe à la fois. Pour ma part, je veux en ajouter parfois une, parfois plus d'une. Aujourd'hui, je veux en ajouter plus d'une (en l'occurrence deux). Comment faire pour garder mes fichiers intacts et jouer avec tout ça librement? J'ai cru à un miracle en ajoutant
function __autoload($class_name) {
   require_once 'outils/ClassesPDF/'.$class_name.'.php';
 }
dans mon fpdf.php mais bon: seul le message d'erreur est changé. J'ai pris l'idée dans le tuto suivant: http://www.phpfrance.com/tutoriaux/inde ... c-php-5#a7

Voici mon code:
		if (isset($Sceau)) {
//			require("outils/ClassesPDF/ellipse.php");
//			require("outils/ClassesPDF/circulartext.php");
//			$rond = new PDF($Orientation, "mm", array(10, 20));
			$pdf->ellipse->Circle($Sceau['x'], $Sceau['y'], $Sceau['rayon'], 'D');
			$pdf->Circle($Sceau['x'], $Sceau['y'], $Sceau['rayon']+3, 'D');
			$pdf->SetFont("Times", '', 6);
      		$pdf->SetTextColor(0, 0, 0);
      		$pdf->Text($Sceau['x']-($Sceau['rayon']/2), $Sceau['y'], 'Nul sans le sceau');
		}

Je l'ai laissé tel quel, avec plusieurs traces de différents essais que j'ai faits.

La méthode habituelle est de créer un objet à partir de la classe fille.
Ça marche avec une seule fille, mais comment le faire avec deux filles? (elles sont jalouses, hihihi)

J'ai pensé faire anisi:
Class Essai extends FPDF {
  include("outils/classesPDF/ellipse.php");
 ...
}
message d'erreur



Bref, comment faire?

Merci.
Soyez artisans de paix

ViPHP
ViPHP | 2287 Messages

29 avr. 2010, 14:50

La méthode habituelle est de créer un objet à partir de la classe fille.
Ça marche avec une seule fille, mais comment le faire avec deux filles? (elles sont jalouses, hihihi)

J'ai pensé faire anisi:
Class Essai extends FPDF {
  include("outils/classesPDF/ellipse.php");
 ...
}
message d'erreur
Hello,

Ben sur le code que tu donnes si tu as fait *exactement* ça c'est un peu normal. Dans une classe on ne peut introduire du code qu'à l'intérieur des méthodes.

A quoi ressemble ellipse.php ?
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Mammouth du PHP | 881 Messages

29 avr. 2010, 18:23

Le colde ellipse.php n'est pas en problème, c'est certain.
Voici comment je l'exploite quand j'ai une seule classe fille:
require("outils/ClassesPDF/ellipse.php");
$rond = new Elllipse(machin, truc, chose);
$rond->commande_habituelle;
$rond->commande_habituelle;
mais voilà que je veux exploiter deux classes, comme ceci:
require("outils/ClassesPDF/ellipse.php");
require("outils/ClassesPDF/TexteEnRond.php");
$rond = new Elllipse(machin, truc, chose);
$rond->commande_habituelle;
$rond->commande_habituelle;
$TextRond = new TexteEnRond(Details, details2, etc);
$TextRond->commande_habituelle;
$TextRond->commande_habituelle;
Je me retrouve donc avec deux objets que je n'arrive pas à fusionner.

Je ne veux pas toucher aux code des classes, car leurs associations pourraient changer.
Par exemple, je ne veux pas passer de
class Ellipse expands FPDF { ...}
class TextRond expands FPDF { ...}
à
class Ellipse expands FPDF { ...}
class TextRond expands Ellipse { ...}
car j'aurai besoin de TextRond séparément ailleurs.

Je préférerais que toutes les functions de Ellipse, de TextRond et de toute autre classe deviennent partie intégrante de la classe FPDF à la volée, selon les circonstances, un peu à la manière des include pour du code habituel. C'est pourquoi j'ai ajouté cet __autoload dans FDPF. Mais bon, ça ne fonctionne pas.
Soyez artisans de paix

Mammouth du PHP | 881 Messages

29 avr. 2010, 18:32

J'oubliais ... j'ai aussi pensé à une solution de ce genre: créer une nouvelle classe qui soit dépendante des deux autres, elles-mêmes dépendantes de FPDF, mais je n'y arrive pas.
class Inclusive extends TextRond, Ellipse {
}

//ou encore sans virgule
class Inclusive extends TextRond Ellipse {
}

//Je n'ai pas essayé avec une parenthèse qu'en pensez-vous?
class Inclusive extends (TextRond, Ellipse) {
}

Soyez artisans de paix

ViPHP
ViPHP | 2287 Messages

29 avr. 2010, 18:34

Dans ce cas, à part une duplication de ces classes dans de nouvelles classes spécifiques, je ne vois pas de solution pour toi (en tout cas rien de simple). Ce que tu voudrais ressemble à de l'AOP mais ça n'existe pas en php en natif (et de toute façon il faut coder de manière spécifique pour l'exploiter, ce que tu refuses).

Non, je ne te parlerais pas d'héritage multiple, ce mot est un blasphème dans le monde PHP :)
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Mammouth du PHP | 881 Messages

29 avr. 2010, 18:41

Est-ce que je pourrais avoir une variable pour définir la dépendance ?
Exemple:

J'ai actuellement
class ellipse extends FPDF {
}
Est-ce que je pourrais avoir
class ellipse extends $LaClasseSouhaitee {
}
?

Je pourrais ainsi parfois avoir $LaClasseSouhaitee = "FPDF" et d'autres fois $LaClasseSouhaitee = "TextRond"
Soyez artisans de paix

ViPHP
ViPHP | 2287 Messages

29 avr. 2010, 19:07

Fais donc le test toi-même...

30 secondes pour écrire le script, une éternité pour contempler la parse error qu'il produit. (Combien de minutes as-tu passé à rédiger la question ? :) )
if(!@work()){ Nespresso(); } else { what(); }
______________________________

ViPHP
ViPHP | 2287 Messages

29 avr. 2010, 19:12

Il y a bien une solution mais je ne peux pas vraiment te la recommander, il faut regarder du côté de l'extension runkit :

http://fr.php.net/manual/fr/function.ru ... cipate.php
http://fr.php.net/manual/fr/function.ru ... -adopt.php

Mais c'est franchement sale... à toi de voir.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Mammouth du PHP | 881 Messages

29 avr. 2010, 20:45

Merci,

je devrai me soumettre et créer des classes spécifiques.

J'ai essayé de mettre une variable pour décrire la dépendance, mais ça ne fonctionne pas,
donc pour ceux qui suivent le fil ou cherchent une solution semblable, sachez que
class ellipse extends $Dependance {
ne fonctionne pas.

Quant à Runkit ... bah ... si tu ne me le recommandes pas ... euh .. bon ben on va s'en passer hein.

Merci.


Ce que je fais: j'ajoute les fonctions Circle et Ellipse dans la classe FPDF, car ce sont des fonctions fréquemment demandées, quant aux autres, je les appellerai au besoin.
Soyez artisans de paix

ViPHP
ViPHP | 2287 Messages

29 avr. 2010, 21:39

Désolé de ne pas avoir mieux à te proposer, sincèrement. Tu butes là sur une des limites actuelles de PHP...

runkit, je ne recommande pas car c'est une extension un peu contre-nature, un peu comme si moi (marchand de fruits) je voulais te vendre des fraises OGM bleues, toi client tu serais en droit de te méfier ! Après ça peut aussi adresser certains besoins, tout dépend ce que tu es en train de développer (si tu fais juste ton site perso dans ton coin tu n'as pas à tenir compte de cet avis et tu peux foncer, mais si ton code est susceptible d'être distribué, déménagé, maintenu à long terme ou encore critique en terme de performances, alors faire appel à runkit peut avoir des conséquences). Runkit te permet de faire des choses que tu ne devrais normalement pas pouvoir faire dans les limites du langage voulues par ses mainteneurs, c'est une extension pour bidouilleurs avertis à utiliser en connaissance de cause donc :)

Certains développeurs ayant des besoin similaires au tien à plus grande échelle ont élaboré des solutions alternatives (mixins dans symfony par exemple) mais le coût de mise en place (et d'éxécution) est très élevé pour ce que ça apporte.

D'autres développeurs ont planché sur des solutions plus académiques et bien pensées (AOP) mais là aussi, il y a un coût non négligeable en réécriture (c'est pas plug'n'play), et tu sors largement des limites traditionnelles du langage.

Enfin il y a traits, le concept d'héritage horizontal de PHP mais qui est encore au stade de RFC pour l'instant, ça ne va donc pas te sauver dans l'immédiat.

Et l'héritage multiple dont je ne voulais pas te parler mais que tu as toi-même abordé... Ca existe en C++ et en java, et ça pose autant voire + de problèmes que ça n'en résout. A priori ça n'arrivera jamais en php.

C'est pourquoi, à moins que tu sois dans une optique maniaque, je pense que la duplication de la classe est ton meilleur choix.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Invité
Invité n'ayant pas de compte PHPfrance

27 août 2010, 13:51

Bien le bonjour à vous,

@Patriboom : J'en ai rêvé également de pouvoir inclure dynamiquement les scripts de Fpdf. Le grand souci est que la majorité de ces derniers font appels à la classe mère, le parent:: rendait l'affaire difficilement négociable. De ce fait, je vous invite à regarder une solution qui demande un soupçon de codage et en demandera un brun sur chaque classe de fonctionnalité mais le résultat donnerra ceci : $pdf->Cercle_Circle($...).

C'est par --> ici !

Bonne programmation !

@+