Как предотвратить переопределение родительских свойств в классе PHP? - PullRequest
0 голосов
/ 24 апреля 2019

Я новичок в PHP ООП. Я хочу предотвратить переопределение свойств родительского класса, когда инициируется дочерний класс. Например, у меня есть Parent и Child классы следующим образом:

class Parent {
    protected $array = [];

    public function __construct() {
    }

    public function add($value) {
        $this->array[] = $value;
    }

    public function get() {
        return $this->array;
    }
}

class Child extends Parent {
    public function __construct() {
    }
}

Во-первых, я инициировал Parent класс, добавивший 3 элемента к свойству array:

$parent = new Parent;
$parent->add('a');
$parent->add('b');
$parent->add('c');

Затем я инициировал класс Child и добавил 1 элемент в свойство array:

$child = new Child;
$child->add('d');

Фактический результат:

var_dump($parent->show()); // outputs array('a', 'b', 'c')
var_dump($child->show()); // outputs array('d')

Ожидаемый результат:

var_dump($parent->show()); // outputs array('a', 'b', 'c', 'd')
var_dump($child->show()); // outputs array('a', 'b', 'c', 'd')

Как я могу это сделать? Я попробовал это, но это не сработало:

class Child extends Parent {
    public function __construct() {
        $this->array = parent::get();
    }
}

Ответы [ 3 ]

0 голосов
/ 24 апреля 2019

Вы должны сделать это.

$child = clone $parent; 
$child->add('d');
0 голосов
/ 26 апреля 2019

Я сделал это используя статическую переменную. Мои занятия сейчас такие:

class Parent {
    protected static $array = [];

    public function __construct() {
    }

    public function add($value) {
        self::$array[] = $value;
    }

    public function get() {
        return self::$array;
    }
}

class Child extends Parent {
    public function __construct() {
    }
}

Когда я проверил это, я получил то, что ожидал:

$parent = new Parent;
$parent->add('a');
$parent->add('b');
$parent->add('c');

$child = new Child;
$child->add('d');

var_dump($parent->show()); // outputs array('a', 'b', 'c', 'd')
var_dump($child->show()); // outputs array('a', 'b', 'c', 'd')
0 голосов
/ 24 апреля 2019

Кажется, что расширение класса - это не то, что вы хотите здесь сделать.

Вы должны прочитать о разнице между классами и объектами. Возможно, вам следует сначала сделать общее руководство по ООП.

Вам нужно использовать статические переменные, если вы хотите, чтобы они были разделены между экземплярами ваших классов.

...