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 に設定すると、子クラスでアクセスできます。または、代わりに、構成を返す親クラスにメソッドを作成します。

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