0

好的,我有一点问题。这是场景:我需要能够获取 test2 的构造函数,以便能够访问 main_class 内部的类属性 test,该类属性已由 main_class 的构造函数设置。我不知道如何让它工作,我需要系统完全像这样工作。现在,如果我在代码中设置类变量,这将起作用,就像var test = "hello";在类定义中一样,但当然在这种情况下,main_class::test 是由它的构造函数设置的,而不是“var”,所以它不会不工作。

这是我的代码的高度简化版本:

索引.php:

<?php

class main_class
{
    private $test2;
    public function __construct()
    {
        $this->test2 = array();
        include("./test1.php");
        $var_name = "test";
        $this->$var_name = new test1();
    }

    protected function do_include()
    {
        include("./test2.php");
        $this->test2["test2"] = new test2();
    }
}

$test = new main_class();

?>

测试1.php:

class test1 extends main_class
{
    public function __construct()
    {
        $this->do_include();
    }
}

?>

测试2.php:

class test2 extends test1
{
    public function __construct()
    {
        print_r($this->test);
    }
}

?>

使用此代码,我收到此错误:注意:未定义属性:test2::$test

提前致谢...

4

1 回答 1

1

我怀疑部分问题可能是您没有在 test2 类中调用父构造函数:

class test2 extends test1
{
    public function __construct()
    {
        parent::__construct();
        print_r($this->test);
    }
}

如果该行被省略,那么您的 test2 构造函数将完全覆盖 test1 构造函数,并且$this->do_include()永远不会被调用。

另外,请记住,当您调用 时$this->test2["test2"] = new test2();,您正在创建该类的一个新实例,该实例与当前实例无关。

澄清一下,这里是事件的顺序:

$test = new main_class(); // calls the constructor of main_class:

public function __construct()
{
    $this->test2 = array();
    include("./test1.php");
    $var_name = "test";
    $this->$var_name = new test1();
}

然后:

$this->$var_name = new test1(); // calls the constructor of test1:

public function __construct()
{
    $this->do_include();
}

...从 main_class 调用 do_include():

protected function do_include()
{
    include("./test2.php");
    $this->test2["test2"] = new test2();
}

然后:

$this->test2["test2"] = new test2(); // calls the constructor of test2:

public function __construct()
{
    print_r($this->test);
}

这会创建一个对象,而您在其构造函数中所做的只是打印一个尚不存在的变量 ($test)……因为您还没有做任何事情来创建它。

于 2013-09-30T17:56:25.390 回答