3

这是我的第一个问题,也让我很困惑。我不确定这是否是简单的事情,我忽略了它还是不可能的事情。

下面是我原始代码的一个非常简化的版本。最终目标是输出如下:

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 声明为静态时它工作正常,但是在实际应用程序中它不起作用,当我尝试回显 parent::test_variable 时它输出“对象 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

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

菲尔

4

1 回答 1

2

在类内部声明public $test_variable;意味着类的每个实例(对象)都有一个副本。$test_variableA 类中的内存地址与$test_variableB 类中的内存地址不同。这样做是为了允许范围并删除全局状态。正如您之前所说,将其声明为静态将起作用,因为每个实例共享相同的变量。

在这种情况下,$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();

所以,这只是关于如何考虑处理这个问题的想法。

于 2012-08-01T19:00:21.163 回答