Oui tu as raison ; ). En fait, ça lève un warning de "strict standard", mais ne provoque pas d'erreur.La je ne voit pas pourquoi :O PHP5 supporte très bien cela.
Oui tu as raison ; ). En fait, ça lève un warning de "strict standard", mais ne provoque pas d'erreur.La je ne voit pas pourquoi :O PHP5 supporte très bien cela.
Oo sur quel version de PHP ?? Sa m'inquiete, c'est le genre de truc que j'utilise partout...
bon j'ai repris tout ca et maintenant ca ressemble à ca :
je vous copie / colle mes classes !
Ma classe myIterator :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 class CollectionCategorie implements IteratorAggregate { private $items = array(); private $count = 0; public function __construct($bdh) { $sql = "SELECT idCat, nomCat, description FROM categories ORDER BY idCat;"; $sth = $bdh->query($sql); $result = $sth->fetchAll(PDO::FETCH_ASSOC); foreach ( $result as $c ) { $cat = new Categorie($bdh); $cat->setId($c['idCat']); $cat->setNomCat($c['nomCat']); $cat->setDescription($c['description']); $this->items[] = $cat; } } public function getIterator() { return new MyIterator($this->items); } public function add($value) { $this->items[$this->count++] = $value; } }
et la classe catégories :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 class MyIterator implements Iterator { private $var = array(); public function __construct($array){ if (is_array($array) ) $this->var = $array; } public function rewind() { reset($this->var); } public function current() { $var = current($this->var); return $var; } public function key() { $var = key($this->var); return $var; } public function next() { $var = next($this->var); return $var; } public function valid() { $var = $this->current() !== false; return $var; } }
malheureusement quand je fais cela :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 class Categorie { private $idCat; private $nomCat; private $description; function __construct($dbh){ $this->dbh = $dbh; $this->description = ''; $this->nomCat = ''; $this->idCat = 0; } function __tostring(){ return "Nom : $nomCat"; } function getId(){ return $this->idCat; } function getNomCat(){ return $this->nomCat; } function getDescription(){ return $this->description; } function setId($id){ $this->idCat = $id; } function setNomCat($nomC){ $this->nomCat = $nomC; } function setDescription($des){ $this->description = $des; }
ca ne marche pas !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 <?php include_once('conf/conf.inc.php'); include_once('fonctions.php'); $collect = new CollectionCategorie($dbh); foreach ($collect as $key => $val) { echo $key -> $val; } ?>
Il m'affiche 2 fois "Nom : " ce qui prouve qu'il crée bien deux catégories mais c'est tout !
J'ai fait un echo dans la classe Myiterator j'arrive à voir les identifiants mais c'est tout ...
Ca me parait très complexe tout ca pourriez vous m'aider ? Merci d'avance
Dans ce code, $key est un index (index de l'array passé à l'itérateur).
Code : Sélectionner tout - Visualiser dans une fenêtre à part echo $key -> $val;
Ca donne quoi si tu essais:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 $collect = new CollectionCategorie($dbh); foreach ($collect as $cat) { echo $cat->getNomCat(); }
hum ca a marché direct :p
merci bien !
Mais alors dans ce cas à quoi me sert ma méthode __tostring ? si l'itérateur peut pas lire directement un objet ?
C'est parce que ta méthode toString est erronée : tu dois utiliser $this->nomCat au lieu de $nomCat !
__toString() est une méthode "magic" qui laisse la possibilité à l'utilisateur de définir comment l'objet doit être affiché si celui-ci est converti en string. C'est le cas si tu fais:
echo $cat;
Dans l'exemple que j'ai posté.
voilà j'ai modifié et mis
ca marche au poil !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 foreach ($collect as $cat) { echo $cat.'<br/>'; }
Ptite question subsidiaire :
Pensez vous qu'il est plus logique de dire que la catégorie est directement une collection d'article ? ou alors de faire une classe collection d'articles ?
dur dilemne qui dépend fortement du reste de l'application !
De manière simple je pars du principe que moins il y a de classe, mieux je me porte donc j'aurais tendance à dire dans un premier temps qu'une categorie est capable de gérer des articles, néanmoins ca peut evoluer dans le temps et le jours où ca devient le boxon, un petit refactoring et hop naissance d'une nouvelle classe ad-hoc...
A toi de voir...Pensez vous qu'il est plus logique de dire que la catégorie est directement une collection d'article
J'aurais plutôt tendance à dire qu'une catégorie n'est pas une collection d'articles (toujours dans le cadre de ton problème). C'est une entité à part. On peut imaginer des problèmes où on manipule des catégories sans se soucier des articles.
Le but final c'est quand même que ton programme fonctionne, et c'est la réalité du terrain qui aura le dernier mot...
bon j'ai mis une tite méthode collectionArticles($idCat) dans ma classe catégories
Mais j'aime pas trop ca parceque la classe catégorie est au courant de ce qu'il y a dans la table articles...
Bref dur dilemme comme tu disais ...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager