ZuGbEn
Messages postés32Date d'inscriptionlundi 14 octobre 2002StatutMembreDernière intervention 7 juillet 2007
-
13 déc. 2006 à 14:45
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDerniè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([???]){
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 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);
}
}
ZuGbEn
Messages postés32Date d'inscriptionlundi 14 octobre 2002StatutMembreDerniè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 !
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 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;
}
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
ZuGbEn
Messages postés32Date d'inscriptionlundi 14 octobre 2002StatutMembreDerniè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)...
DiGhan
Messages postés239Date d'inscriptionsamedi 21 février 2004StatutMembreDernière intervention 3 juin 20101 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;
}
}