这是我的第一个问题,也让我感到难过。我不确定这是不是很简单,我忽视它或者不可能的东西。
以下是我原始代码的简化版本。最终目标是使输出如下:
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'能够在first_function()改变它之后访问test_variable的值。
当我将test_variable声明为static时,它工作正常,但在实际应用程序中它不起作用,当我尝试回显parent :: test_variable时,它输出'Object ID#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
非常感谢任何回复。我非常感谢他们。
菲尔
答案 0 :(得分:2)
在类中声明public $test_variable;
意味着类的每个实例(对象)都有一个副本。类A中的$test_variable
并未指向与类B中的$test_variable
相同的内存地址。这样做是为了允许范围并删除全局状态。正如您之前所说,声明静态将起作用,因为每个实例共享相同的变量。
在这种情况下,$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();
所以,这只是考虑你如何考虑处理这个问题。