@cat_crash

Странное поведение класса PHP. Есть ли идеи?

Собственно проблема со странным поведением внутри _constructor и дальнейшим присвоением значения.

Сам код:
Class ResultIterator extends \ArrayIterator {

	public function __construct($_array,$object){

		if(is_array($_array) && count($_array)>0) {
            foreach ($_array as $v){
            	$value=Util::ArrayToClass($object,$v);
            	$this->append($value);
            	unset($value);
            }
        }
        var_dump($this);
	}
}


возвращает n одинаковых экземпляров данных (var_dump($this)):

bject(OpswatPHP\ResultIterator)#784 (1) {
["storage":"ArrayIterator":private]=>
array(10) {
[0]=>
object(OpswatPHP\Group\GroupResult)#59 (10) {
["group_id":"OpswatPHP\Group\GroupResult":private]=>
string(9) "103455134"
["group_name":"OpswatPHP\Group\GroupResult":private]=>
string(15) "[EXT] Customers"
}
[1]=>
object(OpswatPHP\Group\GroupResult)#59 (10) {
["group_id":"OpswatPHP\Group\GroupResult":private]=>
string(9) "103455134"
["group_name":"OpswatPHP\Group\GroupResult":private]=>
string(15) "[EXT] Customers"
....
}

но если поставить var_dump во внуть цикла:
public function __construct($_array,$object){

		if(is_array($_array) && count($_array)>0) {
            foreach ($_array as $v){
            	$value=Util::ArrayToClass($object,$v);
            	$this->append($value);
            	var_dump($value);
            	unset($value);
            }
        }
        
	}

то выводится правильные данные (разные значения)

object(OpswatPHP\Group\GroupResult)#59 (10) {
["group_id":"OpswatPHP\Group\GroupResult":private]=>
string(22) "0051a00000393LXdefault"
["group_name":"OpswatPHP\Group\GroupResult":private]=>
string(7) "Default"
}
object(OpswatPHP\Group\GroupResult)#59 (10) {
["group_id":"OpswatPHP\Group\GroupResult":private]=>
string(9) "226066674"
["group_name":"OpswatPHP\Group\GroupResult":private]=>
string(9) "[ZZZ] XXX"
}


куда копать ?
  • Вопрос задан
  • 161 просмотр
Пригласить эксперта
Ответы на вопрос 1
SerafimArts
@SerafimArts
Senior Notepad Reader
В PHP все объекты (и ресурсы) всегда передаются по указателю, в отличии от скаляров (и массивов), которые передаются по значению.

Передавая один и тот же объект в каждом "тике" цикла и возвращая его же - ты всегда будешь работать с одним и тем же объектом и патчить его же. Ваш Капитан Документация.

Так что отвечая на вопрос - копать в сторону изучения передачи аргументов в PHP. Это не больно. Т.е. в сторону документации.

P.S. Если переписать конкретно этот код на "человеческий" PHP, то выглядеть он должен так:
class ResultIterator extends \ArrayIterator
{
    public function __construct(array $array, object $object)
    {
        foreach ($array as $value) {
            $this->append(Util::ArrayToClass(clone $object, $value));
        }
    }
}


Но вообще проблема не в нём, а в "ArrayToClass", который занимается манки-патчингом и заставляет клонировать объекты.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы