Page 1 sur 1

Probleme avec __get et accès à des tableaux

Posté : 04 mars 2007, 05:58
par tibabs
Bonjour avec Xampp 1.5.5 et 1.6.0a mes applis ne marchent plus alors qu'en 1.5.2 il n'y a pas de problème.
En faisant des tests j'ai réussi à cerner le problème. Vous trouverez ci-dessous un exemple qui ne donne pas le résultat escompté (
FIN REMPLIR ==> 
au lieu de
FIN REMPLIR ==>Array ( [1] => toto ) 
.

Merci d'avance pour vos aides.
Cordialement,
Thierry.

Code : Tout sélectionner

<?php $foo = new bidon(); class bidon { private $_proprietes = array('_t'); public function __construct() { foreach ($this->_proprietes as $propriete) $this->$propriete = null; $this->remplir(); } public function __set($nom, $valeur ) { if (!in_array($nom, $this->_proprietes, true)) { throw new Exception('propriete ' .$nom .' INCONNUE pour objet ClassAllMembres'); } $this->_proprietes[$nom] = $valeur; } public function __get($nom) { if (!in_array($nom, $this->_proprietes, true)) { throw new Exception('propriete ' .$nom .' INCONNUE pour objet bidon'); } return $this->_proprietes[$nom]; } private function remplir() { $this->_t [1] = 'toto'; print "<br>FIN REMPLIR ==>"; print_r($this->_t); } } ?>

Posté : 04 mars 2007, 13:49
par @rthur
As-tu regardé quelles étaient les différences entre Xampp 1.5.2 et 1.5.5?
Travaillais tu également en PHP5 avec Xampp 1.5.2?

Probleme avec __get et accès à des tableaux

Posté : 04 mars 2007, 16:47
par tibabs
Salut,

Il s'agit effectivement de développement en PHP5.

J'avoue que je n'ai pas regardé en profondeur les différences en ces différentes versions. J'avoue aussi que je ne sais pas comment faire pour rentrer dans le source d'une version de PHP.
Par contre, hier soir (ce matin vers 6h00) après avoir posté ce message j'ai été visité la base de données des bugs référencés sur php.net et j'ai constaté que des problèmes similaires étaient référencés (pb de passage par valeur ou par référence). J'ai posté aussi un message sur le forum d'apachefriends (xampp).
Je viens d'obtenir une réponse que je vous transmets et que je n'ai pas encore testé et pour lequel je ne connais pas la pérennité dans le temps.

Code : Tout sélectionner

public function __get($nom) {
For example you can change this line to:

Code : Tout sélectionner

public function &__get($nom) {
Ca m'a l'air d'aller dans le bon sens, mais cela m'interpelle quand même.

Probleme avec __get et accès à des tableaux

Posté : 04 mars 2007, 18:19
par Invité
Après essai, cela ne marche malheureusement pas !!!

Posté : 04 mars 2007, 20:39
par titerm
En tte logique, puisque tu fais référence a un tableau via des offsets, il aurait fallut que tu implémentes l'interface ArrayAccess.
Autre solution, au lieu d'initialiser a null, tu initialise avec un object qui implémente nativement cette interface.
  
...
public function __construct() {
      foreach ($this->_proprietes as $propriete) $this->$propriete = new ArrayObject();
      $this->remplir();
   }

...



Après exec, tu as
FIN REMPLIR ==>
ArrayObject Object
(
[1] => toto
)

[Resolu]

Posté : 05 mars 2007, 00:40
par tibabs
Effectivement je viens de tester avec la modification que tu proposes.
Elle marche très bien.
JE dois toutefois indiquer qu'entre temps, suite une aide d'un autre forum, j'ai upgradé à la 5.2.1 qui a corrigé pas mal de bugs notamment sur __get.

Je ne sais pas si cela aurait aussi bien marché avec la 5.2.0 mais ta solution me semble plus propre.

Merci encore.