PHP5 OOP:访问更改的父属性

时间:2012-08-01 16:26:20

标签: php oop inheritance extending

这是我的第一个问题,也让我感到难过。我不确定这是不是很简单,我忽视它或者不可能的东西。

以下是我原始代码的简化版本。最终目标是使输出如下:

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

非常感谢任何回复。我非常感谢他们。

菲尔

1 个答案:

答案 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();

所以,这只是考虑你如何考虑处理这个问题。