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
Большое спасибо за любые ответы. Я очень ценю их.
Фил
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();
Итак, это просто мысль о том, как вы могли бы решить эту проблему.