[php5] оператор [] на свойствах класса. Кто виноват

Profic

just Profic (PHP5 BetaTeam)
[php5] оператор [] на свойствах класса, наследованного от DOMDocument

Код
PHP:
<?
class a extends DOMDocument {
	private $prop = array ();

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

	public function setProp1 () {
		echo 'a::setProp1 called<br/>';
		$test = array (1);
		$this->prop[] = $test;
	}

	public function setProp2 () {
		echo 'a::setProp2 called<br/>';
		$test = array (1);
		$prop_ =& $this->prop;
		$prop_[] = $test;
	}
};

class b {
	private $prop = array ();

	public function setProp1 () {
		echo 'b::setProp1 called<br/>';
		$test = array (1);
		$this->prop[] = $test;
	}

	public function setProp2 () {
		echo 'b::setProp2 called<br/>';
		$test = array (1);
		$prop_ =& $this->prop;
		$prop_[] = $test;
	}
};

$o = new a();
$o->setProp1 ();
var_dump ($o);
$o->setProp1 ();
var_dump ($o);
unset ($o); // это еще что за фигня? Если ее убрать, то не создается новый экземпляр класса, а используется старый

echo '<hr/>';

$o = new a();
$o->setProp2 ();
var_dump ($o);
$o->setProp2 ();
var_dump ($o);

echo '<hr/>';

$o = new b();
$o->setProp1 ();
var_dump ($o);
$o->setProp1 ();
var_dump ($o);

echo '<hr/>';

$o = new b();
$o->setProp2 ();
var_dump ($o);
$o->setProp2 ();
var_dump ($o);

?>
выводит
Код:
a::setProp1 called

object(a)[1]
  private 'prop' => 
    array
      empty

a::setProp1 called

object(a)[1]
  private 'prop' => 
    array
      0 => 
        array
          0 => 1

---

a::setProp2 called

object(a)[1]
  private 'prop' => 
    &array

a::setProp2 called

object(a)[1]
  private 'prop' => 
    &array

---

b::setProp1 called

object(b)[2]
  private 'prop' => 
    array
      0 => 
        array
          0 => 1

b::setProp1 called

object(b)[2]
  private 'prop' => 
    array
      0 => 
        array
          0 => 1
      1 => 
        array
          0 => 1

---

b::setProp2 called

object(b)[1]
  private 'prop' => 
    array
      0 => 
        array
          0 => 1

b::setProp2 called

object(b)[1]
  private 'prop' => 
    array
      0 => 
        array
          0 => 1
      1 => 
        array
          0 => 1
Обратите внимание на 1 и 2 случай и не комментарий. Кто это думает по этому поводу? В базе багов php ничего не нашел. Правда я не силен в ихнем поиске :(
PHP-5.0.0RC3/xdebug-2.0.0dev (последний точно виноват - проверял).

-~{}~ 19.06.04 15:24:

ЗЫ. Да кстати ни прямое указание индекса при присвоении, ни использование array_merge не решают данную проблему...

-~{}~ 19.06.04 15:28:

ЗЫЫ. Модераторы, смените название топика, плиз.

-~{}~ 19.06.04 15:37:

Нашел баг в базе. Кому интересно http://bugs.php.net/28817
 

tony2001

TeaM PHPClub
из тестового примера ничего не понять, честно говоря.
значительно больше информации даёт баг-репорт.
насколько я знаю, есть некоторые проблемы с extend встроенных классов.
видимо, их будут решать.
 

Profic

just Profic (PHP5 BetaTeam)
tony2001
Хех, понятно.
Пример привел, тот на котором понял, че за фигня творится вообще :).

Пока они там решают её для тех, кто может столкнуться с данной проблемой :)
PHP:
$this->prop[] = $var;
if (!sizeof ($this->prop)) {
    $this->prop[] = $var;
}
Вот такой вот ugly hack :(
 
Сверху