2

我有一个奇怪的问题,我在父类中设置值,但无法在扩展父类的子类中访问这些值。

class Parent
{
    protected $config;

    public function load($app)
    {
        $this->_config();
        $this->_load($app);
    }

    private function _config()
    {
        $this->config = $config; //this holds the config values
    }

    private function _load($app)
    {
        $app = new $app();
        $this->index;
    }
}

class Child extends Parent
{
    public function index()
    {
        print_r($this->config); // returns an empty array
    }
}

$test = new Parent();
$test->load('app');

当我这样做时,我会打印出一个空数组。但是如果我这样做,那么我就可以访问这些配置值。

private function _load($app)
{
    $app = new $app();
    $app->config = $this->config
    $app->index;

}

class Child extends Parent
{
    public $config;
          ....
}

然后我可以从父级访问配置数据。

4

2 回答 2

3

在初始化任何内容之前,您正在访问这些值。首先,您必须设置值。

例子:调用一个方法是父类,它设置值,放在子类的构造函数上。

class Child extends Parent
{
    public function __construct() {
       $this -> setConfig(); //call some parent method to set the config first
    }
    public function index()
    {
        print_r($this->config); // returns an empty array
    }
}

更新:您似乎也对 OOP 的概念感到困惑

class Parent { ..... }
class child extends Parent { ..... }
$p = new Parent(); // will contain all method and properties of parent class only
$c = new Child(); // will contain all method and properties of child class and parent class

但是,您必须像在普通对象中一样使用父方法和属性。

让我们看另一个例子:

class Parent { 
     protected $config = "config";
}
class Child extends Parent {
     public function index() {
           echo $this -> config; // THis will successfully echo "config" from the parent class
     }
}    

但另一个例子

class Parent { 
     protected $config;
}
class Child extends Parent {
     public function index() {
           echo $this -> config; //It call upon the parent's $config, but so far there has been no attempt to set an values on it, so it will give empty output.
     }
}
于 2012-05-04T00:02:19.180 回答
1

这是因为父级中的属性受到保护。将其设置为公开,您可以在子类中访问它。或者,在返回配置的父类中创建一个方法:

public function getConfig()
{
    return $this->config;
}
于 2012-05-03T23:58:18.770 回答