PHP5 ООП: Доступ к измененным родительским свойствам


Это мой первый вопрос, и кое-что поставило меня в тупик. Я не уверен, что это что-то простое, и я упускаю это из виду или что-то невозможное.

Ниже приведена очень упрощенная версия моего исходного кода. Конечная цель состоит в том, чтобы получить следующий результат:

1: 
2: this is a test
3: this is another test
4: this is another test

Однако, с кодом в его текущем состоянии, его фактический вывод таков:

1: 
2: this is a test
3: this is another test
4: 

Я хочу, чтобы объект 'B' мог получить доступ к значению test_variable ПОСЛЕ изменения first_function() это.

Он отлично работает, когда я объявляю test_variable статическим, однако в реальном приложении он не будет работать, и когда я пытаюсь повторить parent::test_variable, он выводит "Идентификатор объекта #17" и так далее.

class A
{
    public $test_variable;

    function __construct()
    {
        echo '1: ' . $this->test_variable . "<br />";
        $this->test_variable = 'this is a test';
        echo '2: ' . $this->test_variable . "<br />";
    }

    function first_function()
    {
        $this->test_variable = 'This is another test';
        echo '3: ' . $this->test_variable . "<br />";
        $b = new b;
        $b->second_function();
    }
}



class B extends A
{
    function __construct()
    {
        /* Dont call parent construct */
    }

    function second_function()
    {
        echo '4: ' . $this->test_variable;
    }
}

$a = new A;
$a->first_function();

// Outputs:
// 1:
// 2: this is a test
// 3: this is another test
// 4: 

// but I want it to output
// 1: 
// 2: this is a test
// 3: this is another test
// 4: this is another test

Большое спасибо за любые ответы. Я очень ценю их.

Фил

Author: hakre, 2012-08-01

1 answers

Объявление public $test_variable; внутри класса означает, что каждый экземпляр (объект) класса имеет копию. $test_variable в классе A не указывает на тот же адрес памяти, что и $test_variable в классе B. Это сделано намеренно, чтобы разрешить область действия и удалить глобальное состояние. Как вы уже говорили ранее, объявление его статическим будет работать, потому что тогда каждый экземпляр использует одну и ту же переменную.

В данном случае $test_variable, по сути, является зависимостью, которая требуется классу B. Вы можете получить эту зависимость с помощью конструктора инъекция довольно легко:

class A
{
    public $test_variable;

    function __construct()
    {
       echo '1: ' . $this->test_variable . "<br />";
       $this->test_variable = 'this is a test';
       echo '2: ' . $this->test_variable . "<br />";
    }

    function first_function()
    {
       $this->test_variable = 'This is another test';
       echo '3: ' . $this->test_variable . "<br />";

       // Instantiate instance passing dependency
       $b = new b($this->test_variable);

       $b->second_function();
    }
}

class B extends A
{
    function __construct($dependency)
    {
       // Set dependency
       $this->test_variable = $dependency;
    }

    function second_function()
    {
       echo '4: ' . $this->test_variable;
    }
}

$a = new A;
$a->first_function();

Итак, это просто мысль о том, как вы могли бы решить эту проблему.

 2
Author: Jeremy Harris, 2012-08-01 19:00:21