var_dump() , debbuger ZendStudio et ArrayObject

Mammouth du PHP | 505 Messages

16 mars 2006, 16:15

Impossible de voir les propriétés d'une class qui étends ArrayObject (class de la SPL), ni dans var_dump() ni dans le debugger de ZendStudio...
class ArrayObjectFirst  {
	public $myProp = "test<br>";
	public function myFunc() {
		return "myFunc() got ".$this->myProp;
	}
}


class ArrayObjectBis extends ArrayObject  {
	public $myProp = "test<br>";
	public function myFunc() {
		return "myFunc() got".$this->myProp;
	}
}

$foo = new ArrayObjectFirst();
$foo2 = new ArrayObjectBis();

var_dump($foo);
var_dump($foo2);
will display

Code : Tout sélectionner

object(ArrayObjectFirst)#1 (1) { ["myProp"]=> string(8) "test" } object(ArrayObjectBis)#2 (0) { }
Quelqu'un a une idée sur le pb ??

Mammouth du PHP | 1311 Messages

16 mars 2006, 16:37

salut
c'est pas avec la doc que tu va t'en sortir :?
peut eter en appelent le constructeur de arrayobjetc dans ta class derivée?
class ArrayObject implements IteratorAggregate, ArrayAccess, Countable
00600 {
00603     const STD_PROP_LIST     = 0x00000001;
00605     const ARRAY_AS_PROPS    = 0x00000002;
00606 
00614     function __construct($array, $flags = 0, $iterator_class = "ArrayIterator") {}
00615 
00623     function setFlags($flags) {}
00624                         
00627     function getFlags() {}
00628 
00631     function asort() {}
00632     
00635     function ksort() {}
00636     
00639     function uasort(mixed cmp_function) {}
00640     
00643     function uksort(mixed cmp_function) {}
00644     
00647     function natsort() {}
00648     
00651     function natcasesort() {}
00652     
00655     function exchangeArray($array) {}
00656 
00660     function getIterator() {}
00661 
00665     function offsetExists($index) {}
00666 
00670     function offsetGet($index) {}
00671 
00675     function offsetSet($index, $newval) {}
00676 
00679     function offsetUnset($index) {}
00680 
00685     function append($value) {}
00686 
00691     function getArrayCopy() {}
00692 
00696     function count() {}
00697     
00698     /* @param $iterator_class new class used in getIterator()
00699      */
00700     function setIteratorClass($itertor_class) {}
00701     
00702     /* @return class used in getIterator()
00703      */
00704     function getIteratorClass() {}
00705 }
http://www.php.net/~helly/php/ext/spl/
ca peut peut eter t'aider

Mammouth du PHP | 505 Messages

16 mars 2006, 16:58

peut eter en appelent le constructeur de arrayobjetc dans ta class derivée?
Bien que non présent dans l'exemple, j'avais déjà essayé... ca ne change rien.

en plus de var_dump, meme problème avec print_r...

Par contre, si on fait un reflexionClass("ArrayObjectBis"), on lis bien toutes les properties...

Quand au lien que tu donnes a la fin, c est ma base de travail depuis la sortie de php5.1...

Mammouth du PHP | 983 Messages

16 mars 2006, 17:26

ArrayObject encapsulant un tableau, son constructeur nécessite un tableau en argument. Ce bout de code fonctionne chez moi (PHP 5.1.1, Apache 2 sous windows 2000)
<?php
class ArrayObjectBis extends ArrayObject 
{
	public $myProp = null;

	
	public function __construct($arr)
	{
		parent::__construct($arr);
	}
} 

$foo2 = new ArrayObjectBis(array('toto'=>'valeur'));

var_dump($foo2); 

?>

Mammouth du PHP | 505 Messages

16 mars 2006, 18:35

Avec ton code
<?php
class ArrayObjectBis2 extends ArrayObject
{
    public $myProp = "default val";

    
    public function __construct($arr)
    {
        parent::__construct($arr);
    }
}

$foo2 = new ArrayObjectBis2(array('toto'=>'valeur'));
echo "<pre>";
var_dump($foo2);
return;
?>
Voila mon résultat

Code : Tout sélectionner

object(ArrayObjectBis2)#1 (1) { ["toto"]=> string(6) "valeur" }
meme bug. php 5.1.2 solaris 9.

On ne voit pas dans le var_dump la propriété $myProp

Mammouth du PHP | 684 Messages

17 mars 2006, 18:30

Salut.

Je viens de refaire les tests que vous avez donné.
Je penses que le résultat du var_dump est correct même si je suis surpris du résultat.

Je m'explique :
Le code de la SPL pour l'objet ArrayObject doit se comporter comme un tableau. Il donne donc l'avantage de faire du foreach dessus comme pour un tableau même si c'est un objet.
Donc pour rajouter un élément, il suffit de faire un $tat[0] = "ma value".
Par contre je suis étonné que l'on ne puisse pas rajouter des propriétés dans la classe héritante. Il est moins facile de faire de la gestion de traitement sans pouvoir stocker de nouvelles propriétés.

Peut-être que c'est voulu de la part des développeurs de la SPL ?
Sinon c'est peut-être un bug de développement ?
As-tu regardé du côté de bug traker de php ???
Zigz4g

Mammouth du PHP | 505 Messages

17 mars 2006, 20:45

Pour moi le resultat est incorrecte car on ne voit pas la propriété de la classe héritante. Pourtant, cette propriété est bien la. On peux la rajouter, elle est accéssible et on peux la voir en utilisant la classe reflexionClass().

C'est pour moi d'autant plus suspect que j'ai essayé la meme chose avec d'autres classes de la SPL (je ne me souvient plus lesquelles) et ce comportement n'est pas systématique. Avec d'autre classe de la SPL, je pouvais voir les propriétés ajouté avec un var_dump().

Non, je n'ai pas regardé coté bug tracker.

Mammouth du PHP | 505 Messages

17 mars 2006, 21:58

Je ne peux pas faire de test chez moi, mais j'ai peut etre une piste...

si qq peux essayer de faire un var_dump apres avec fait un setFlags(1)
$foo = new ArrayObjectBis2(array('toto'=>'valeur'));
$foo->setFlags(1);
echo "<pre>";
var_dump($foo);

Mammouth du PHP | 505 Messages

20 mars 2006, 10:26

le set flags avec 1 marche mais on ne peux pas avoir tout en une fois...
si on met 1, on a les properties, et avec 0, on a le contenu de l'objet natif, le array_object .

Bref, c'est un comportement bizarre et j'ai du mal a expliquer comment il font ca.
[/code]