PHP OOP Обновление защищенной строки в расширенном классе __construct - PullRequest
5 голосов
/ 09 марта 2019

Я пытаюсь создать свой первый класс PHP и застрял на том, как обновить защищенные строки.

Я пытаюсь создать расширенный класс, который работает с защищенными строками из основного класса.

Я могу обновить строку при загрузке первого класса, но когда я загружаю свой расширенный класс, он не показывает обновленный текст.

Что я делаю не так?

class test {
    protected $testing = 'test';

    function __construct(){
        echo "The Test class has loaded (".$this->testing.")";
        $this->testing='changed';
        echo "Updated to (".$this->testing.")";
    }
}

class test2 EXTENDS test {

    function __construct(){
        echo "The Test2 class has loaded (".$this->testing.")";
        $this->testing='updated';
        echo 'The string has been updated to ('.$this->testing.')';
    }
}

$blah = new test();
$blah2 = new test2();

Я пытаюсь получить следующие результаты:

загружен тестовый класс (test) Обновлено до (изменено)

Класс Test2 загружен (изменен) Строка была обновлена ​​до (обновлено)

Ответы [ 2 ]

5 голосов
/ 09 марта 2019

Вам нужно построить родителя. То, что дочерний класс расширяет родительский класс, не означает, что родительский класс автоматически создается / создается, когда дочерний класс есть. Он просто наследует функциональность (свойства / методы).

Вы можете сделать это с: parent::__construct();

Я сделал несколько небольших правок для вашего источника, в частности PSR-2 в стиле имен классов и разрывов строк. Но все остальное то же самое.

<?php

class Test {
    protected $testing = 'original';

    function __construct(){
        echo "The Test class has loaded (".$this->testing.")\n";
        $this->testing = 'Test';
        echo "Updated to (".$this->testing.")\n";
    }
}

class TestTwo extends test {

    function __construct(){
        echo "Child class TestTwo class has loaded (".$this->testing.")\n";
        parent::__construct();
        echo "Parent class Test class has loaded (".$this->testing.")\n";
        $this->testing = 'TestTwo';
        echo "The string has been updated to (".$this->testing.")\n";
    }
}

$test = new Test();
$testTwo = new TestTwo();

Что даст вам следующий вывод:

The Test class has loaded (original)
Updated to (Test)
Child class TestTwo class has loaded (original)
The Test class has loaded (original)
Updated to (Test)
Parent class Test class has loaded (Test)
The string has been updated to (TestTwo)
4 голосов
/ 09 марта 2019

Объекты не влияют на состояние класса, пока программа продолжает работать, что означает, что эти два экземпляра отделены друг от друга. Однако вы можете сохранить изменения в классе, используя static свойства:

class test
{
    protected static $testing = 'test';

    function __construct()
    {
        echo "The Test class has loaded (" . self::$testing . ")";
        self::$testing = 'changed';
        echo "Updated to (" . self::$testing . ")";
    }
}

class test2 extends test
{
    function __construct()
    {
        echo "The Test2 class has loaded (" . self::$testing . ")";
        self::$testing = 'updated';
        echo 'The string has been updated to (' . self::$testing . ')';
    }
}

$blah = new test();
echo PHP_EOL;
$blah2 = new test2();

Выход:

The Test class has loaded (test)Updated to (changed)
The Test2 class has loaded (changed)The string has been updated to (updated)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...