Oui tu as raison ; ). En fait, ça lève un warning de "strict standard", mais ne provoque pas d'erreur.Citation:
La je ne voit pas pourquoi :O PHP5 supporte très bien cela.
Version imprimable
Oui tu as raison ; ). En fait, ça lève un warning de "strict standard", mais ne provoque pas d'erreur.Citation:
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...
Je test avec la 5.2.1
Ah oui tu as raison.... php :roll:
bon j'ai repris tout ca et maintenant ca ressemble à ca :
je vous copie / colle mes classes !
Ma classe myIterator :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 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:
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:
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:
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:echo $key -> $val;
Ca donne quoi si tu essais:
Code:
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:
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...Citation:
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 ...