[PHP5] Etendre une classe prédéfinie

ZuGbEn Messages postés 32 Date d'inscription lundi 14 octobre 2002 Statut Membre Dernière intervention 7 juillet 2007 - 13 déc. 2006 à 14:45
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 14 déc. 2006 à 19:17
Bonjour !

Je débute plus ou moins dans la programmation orientée objet, et je souhaite faire une classe qui, à partir d'un DomNode existant, ajoute des methodes à cet objets.



Bon déjà je sait pas si c'est possible, ensuite (si ca l'est) je ne sait pas comment construire ma nouvelle classe.

En fait, je ne sait pas vraiment par quoi remplacer les [???] dans le code suivant (qui devrait afficher "  root  ") :






<hr size= "2" width="100%" />

<?php


class class1 extends DomNode{
  publicfunction__construct([???]){
  

[???]



  }
  publicfunction dispName(){
    echo$this->nodeName;
  }
}

// créé un document XML de test
$doc = new DOMDocument();
$doc->loadXML('<root><node/></root>');

// créé un DomNode
$node = $doc->childNodes->item(0);

// créé un objet class1 à  partir du DomNode
$a = new class1($node);

// Test d'une méthode de class1
$a->dispName;
?>

<hr size ="2" width="100%" />


Quelqu'un pourrait-il m'aider ? ou me rediriger vers un tuto assez complet sur les classes en php5, où la réponse aie une chance de figurer ?

Merci beaucoup !

7 réponses

younes371 Messages postés 502 Date d'inscription mercredi 29 décembre 2004 Statut Membre Dernière intervention 20 mars 2012
13 déc. 2006 à 15:12
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
13 déc. 2006 à 15:36
Hello,

pas besoin de constructeur. Dans ce cas, le constructeur de la classe paren,te sera utilisée lorsque ta classe personnalisée sera instanciée.
Sinon, si tu veux faire des ajouts dans le constructeur :

class child extends parent { 
    public function __construct ($var) {
       // traitement spécifique de child
       parent::__construct ($var);
    }
}
0
ZuGbEn Messages postés 32 Date d'inscription lundi 14 octobre 2002 Statut Membre Dernière intervention 7 juillet 2007
13 déc. 2006 à 16:08
Merci youn371, mais le liens que tu m'as donné ne parle pas du tout d'ajouter des méthodes à une classe.

Malalam, je parle d'étendre une classe prédéfinie de php5.

Malheureusement, il n'y a pas de constructeur à cette classe (DomNode), donc en remplacant les premier [???] par $i et le deuxième [???] par parent::__construct($i); , il me sort une erreur
Fatal error: Can not call constructor ...

Si on ne met rien dans les [???], il n'affiche rien (et retourne NULL), ce qui est normal vu que je ne vois pas comment il peut savoir de quel Node il s'agit.






Hum si quelqu'un a encore une idée... jsuis preneur !
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
13 déc. 2006 à 16:37
J'avais compris, je connais bien DOMDocument.
Un document XML est un node. Un gros node.
C'est poiur ça que DOMDocument étend DOMNode...
En clair, DOMNode est la classe de haut niveau, dans cette API.
Donc, si tu veux faire ce que tu veux faire, tu dois déjà redéfinir DOMDocument...DOMElement, DOMNodeList etc...pour que leurs méthodes, attributs retournent ta classe au lieu d'un DOMNode.

Parce que ça : $node = $doc->childNodes->item(0);
ça renvoir un DOMNode. Un objet déjà instancié, je veux dire.

Une solution simple est :

class class1 {
   
    private $node;

  public function __construct(DOMNode $node){
   $this -> node = $node;
  }
  public function dispName(){
    if (is_null ($this -> node)) {
       throw new Exception ('Pas de DOMNode défini');
    }
    echo $this ->node -> nodeName;
  }
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ZuGbEn Messages postés 32 Date d'inscription lundi 14 octobre 2002 Statut Membre Dernière intervention 7 juillet 2007
13 déc. 2006 à 17:05
Ok... j'avais pensé à la "solution simple" mais ca me plaisait pas d'avoir deux variables différentes pour traiter un node... (une instance de DomNode et une autre de ma classe)

Mais bon si il n'y a pas d'autre moyen... je prend quand même !

Hum... c'est triste ... j'hésite à tout foutre dans des fonctions maintenant (qui prendraient en argument le node)...
0
DiGhan Messages postés 239 Date d'inscription samedi 21 février 2004 Statut Membre Dernière intervention 3 juin 2010 1
14 déc. 2006 à 18:52
Hello,

je n'ai jamais utilisé les classes DOMNode et DomDocument.
Cependant, j'ai pu lire que la classe DOMNode est constituée de plusieurs attributs dont un du type DOMNode (node).
De plus DOMNode semble être la classe 'racine' (la + haute au niveau de l'héritage), donc de fortes chances que ces attributs soient déclarés comme étant 'protected'.
N'est-il pas plus simple d'utiliser directement cet attribut dans une classe fille ?

class subClass extends DOMNode
{
public function __construct(DOMNode $pNode)
{
$this->node = $pNode;
}
}
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
14 déc. 2006 à 19:17
C'est qu'est je disais ;-)
Mais dans ce cas, inutile d'étendre DOMNode.
0
Rejoignez-nous