Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/02/2008, 10h52   #1
Membre à l'essai
 
Inscription : mars 2006
Messages : 54
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 54
Points : 24
Points : 24
Par défaut [POO] Classe avec pointeurs de classes

Bonjour,

je suis amené à créer un projet où je dois analyser beaucoup de différents fichiers de configurations sous linux.

pour se faire, j'aimerai réaliser un "parser" plus ou moins universel qui va me retourner un ensemble de valeurs sous une forme comme un arbre binaire.

pour le petit exemple, imaginons la syntaxe suivante (de /etc/dhcp3/dhcpd.conf)
Code :
1
2
3
4
5
6
7
8
9
subnet 10.5.5.0 netmask 255.255.255.224 {
  range 10.5.5.26 10.5.5.30;
  option domain-name-servers ns1.internal.example.org;
  option domain-name "internal.example.org";
  option routers 10.5.5.1;
  option broadcast-address 10.5.5.31;
  default-lease-time 600;
  max-lease-time 7200;
}
je ne vais expliquer le fichier, il faut juste savoir que "subnet" est la base, "10.5.5.0" est un attribut, "netmask" aussi et "255.255.255.224" aussi. Puis le "{" signifie qu'il va passer un à block suivant pour refaire la même analyse plus tard. Petit graphique en mode texte donne ceci:
Code :
1
2
3
4
[subnet]___________
    |   \          \
    |    \          \
[range]  [option]   [option]
et on imagine bien que s'il y a un nouveau block ça crée une nouvelle branche.


Si la logique en elle même ne me pose pas de problème, c'est au niveau du PHP que ça coince!


Comment peut-on définir une sorte de pointeur? Le passage par référence suffit-il?

j'aimerai avoir une classe avec une structure dans le genre:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
class Noeud {
   var $nom;
   var $attributs;
   var &$pere;
   var $fils;
   function __construct($nom, &$pere) {
      $this->pere = $pere;
      $attributs = array();
      $fils = array();
   }
   function ajouterFils((Noeud)&$fils) { $fils[] = $fils }
   [...]
}
vous voyez ce que je veux dire? Je me demande comment je peux utiliser une référence concrètement ou un pointeur vers un élément. Comment savoir si je récupère bien le pointeur et non la valeur? est-ce que ce que je veux faire est réalisable en php?


merci de m'aider
dridri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 11h31   #2
Membre à l'essai
 
Inscription : mars 2006
Messages : 54
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 54
Points : 24
Points : 24
et bien je me suis répondu moi même finalement. comme quoi parfois des tests valent bien mieux qu'un long sujet de forum.

voici ma classe, n'hésitez pas si vous avez quelque chose à redire à ça:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
class node {
	private $name;
	private $values;
	private $childs;
 
	function __construct($name) {
		$this->name = $name;
		$this->values = array();
	}
 
	function addChild(&$node) {
		$this->childs[] = &$node;
	}
 
	function addValue($value) {
		$this->values[] = $value;
	}
 
	function getChilds() {
		return $this->childs;
	}
 
	function getValues() {
		return $this->values;
	}
 
	function printNodes() {
 
		echo("<ul>");
		echo("<li>".$this->name."</li>");
		foreach($this->values as $value) {
			echo("<li>attr: $value</li>");
		}
		if (count($this->childs) > 0) {
			foreach($this->childs as $child) {
				echo("<li>child");
				$child->printNodes();
				echo("</li>");
			}
		}
	}
 
}
?>
dridri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 12h39   #3
Membre Expert
 
Inscription : janvier 2007
Messages : 1 452
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 452
Points : 1 914
Points : 1 914
Salut,
Comme tu demandes quand même un retour en voici un.


En fait, à a la lecture de ton code je vois que tu utilises PHP5 (cf le mof clef __construct). Partant de ce principe je peux te dire que, un objet envoyé en paramètre à une méthode/fonction, le sera forcément par référence (l'équivalent du pointeur dans d'autres langages).
A contrario pour envoyer une copie, tu devras au préalable le cloner.
Et que l'utilisation du é commerciale *&* est donc inutile, dans la méthode addChild.
Si tu veux vérifier, tu dump l'objet avant de l'envoyer dans la méthode et tu le re dumpes à l'intérieur de la méthode. Un uid est créé pour chaque objet, il sera le même dans le cas d'un passage par référence, différent dans la cas d'un passage par copie.


Ici 660.


bye
kaymak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 17h53   #4
Membre à l'essai
 
Inscription : mars 2006
Messages : 54
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 54
Points : 24
Points : 24
merci pour ta réponse... je ne savais pas qu'en php5 tout objet était par référence et que c'était assez vilain en fait les référence quand on pense à ça plus à des pointeurs à la "C"...

je me suis pris pas mal la tête, mais bon, ça va marcher :p
dridri est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h23.


 
 
 
 
Partenaires

Hébergement Web