классы и возврат результата

SergXP

Новичок
Всем привет! Что-то интересное происходит, или я не догоняю))
PHP:
class A {
    public $arr = array();
    public $curr = null;

    function addElement($element) {
       unset($this->arr[$this->curr]); // удаляем предыдущий элемент, если убрать эту строку, массив будет накапливаться
        $this->arr[$element] = null;   // создаем пустой элемент
        $this->curr = $element;        // указатель на текущий элемент
        return $this;
    }
    function setAttr($name,$value) {
        $this->arr[$this->curr][$name] = $value;  // какое-то значение для текущего элемента
        return $this;
    }
}

class B extends A {
    function __construct() {
        
        $element1 = $this->addElement('element1');
        $element1->setAttr('type','circle');
        
        $element2 = $this->addElement('element2');
        $element2->setAttr('type','box');
        
        print_r($element1);
        
    }
}

$class = new B;
по идеи print_r($element1); должен вывести массив:
PHP:
Auth Object
(
    [arr] => Array
        (
            [element1] => Array
                (
                    [type] => circle
                )

        )

    [curr] => element1
)
но на самом деле получаю:
PHP:
Auth Object
(
    [arr] => Array
        (
            [element2] => Array
                (
                    [type] => box
                )

        )

    [curr] => element2
)
почему переменная $element1 меняет свое значение, присваивая значение, последнего вызова addElement()?
хотелось бы, чтобы $element1 и $element2 имели разные значения..

Спасибо!
 

С.

Продвинутый новичок
// удаляем предыдущий элемент, если убрать эту строку, массив будет накапливаться
А какой смысл иметь массив только с одним элементом?
почему переменная $element1 меняет свое значение,
Потому что $element1 и $element2 ссылаются на один и тот же объект. Кто последний, тот и папа.
 

SergXP

Новичок
Потому что $element1 и $element2 ссылаются на один и тот же объект. Кто последний, тот и папа.
это равносильно тому, что:
PHP:
$a = 5;
$b = 10;
echo $a; // результат 10..
А какой смысл иметь массив только с одним элементом?
мне удобней так генерировать определенные массивы..

и как быть в данной ситуации? Копить массив?
Не хотелось бы, но на крайний случай придется\\
 

С.

Продвинутый новичок
это равносильно тому, что...
Не равносильно. Человек, знаюший слово "extends", но не знающий, что в РНР объекты всегда передаются по ссылкам -- подозрительный человек.
мне удобней так генерировать определенные массивы..
Да уж какое может быть удобство иметь массив с единственным элементом, переменную с ключем этого элемента и перед добавлением нового элемента, всегда удалять имеющийся. Ты изобрел массив, ведущий себя как скаляр.
 

SergXP

Новичок
в РНР объекты всегда передаются по ссылкам
знаю как использовать, но не знал что так передаются) по крайней мере не сталкивался с подобным..
хорошо, тогда придется сделать сбор в один массив, и немного поменять принцип использования.
Да уж какое может быть удобство иметь массив с единственным элементом,
допустим мне потом понадобится вызов:
PHP:
$this->group(array($element1,$element2)); 
$this->group(array($element3,$element4));
поэтому мне было бы удобней в плане использования)
у Вас есть идеи, как это реализовать?
 

fixxxer

К.О.
Партнер клуба
Пока что складывается впечатление необъяснимого желания вырезать гланды проктологическим путем =) Может на конкретной задаче пояснишь?
 

SergXP

Новичок
Пока что складывается впечатление необъяснимого желания вырезать гланды проктологическим путем
ну спасибо! )))))))))

Возможность объявлять переменные таким образом:
PHP:
        $element1 = $this->addElement('element1');
        $element1->setAttr('type','circle');
        
        $element2 = $this->addElement('element2');
        $element2->setAttr('type','box');
 

С.

Продвинутый новичок
Да ради бога! Только Если нужно чтобы $element1 и $element2 были разными, то и получать они должны разные копии объектов, а не один и тот же. В курсе про "new"?
 

SergXP

Новичок
естественно в курсе..
хорошо, так и поступлю))
Спасибо!
 
Сверху