0
class parents{
    public $a;
    function __construct(){
        echo $this->a;
    }
}
class child extends parents{
   function __construct(){
        $this->a = 1;
        parent::__construct();
    }
}
$new = new child();//print 1

上記のコードは 1 を出力します。これは、子クラスのインスタンスを作成し、その親から継承されたプロパティに値を割り当てるたびに、その親クラスのプロパティも割り当てられていることを意味します。ただし、以下のコードは異なることを示しています。

class parents{
    public $a;
    function test(){
        $child = new child();
        echo $this->a;
    }
}

class child extends parents{
    function __construct(){
        $this->a = 1;
    }
}
$new = new parents();
$new->test();//print nothing

子クラスに値を割り当てたところ、親がその子クラスに割り当てられた値を明らかに持っていなかったのはなぜですか?

ありがとう!

4

5 に答える 5

1

上の例では、コンストラクト関数が子クラスから呼び出されているため、使用されているオブジェクトを、親クラスの関数を使用しているだけの子オブジェクトであるかのように扱っています。

下の例では、独立して動作する 2 つの別個のオブジェクトがあります。親オブジェクトには $a があり、子にもありますが、別のオブジェクトに含まれているため、同じ $a ではありません。したがって、親クラスで $this->a を出力すると、親の $a インスタンスが参照されますが、子クラスで $this->a =1 を設定した後に $a をエコーすると、子のインスタンスが表示されます。 $a.

これで問題が解決することを願っています。

于 2013-07-25T16:06:19.737 に答える
0

これは、2 つの異なるインスタンスがあり、共通点がないためです (継承を除く)。例外の動作は、php がサポートしていない内部クラスで生成される可能性があります。

すべてのインスタンスで var accros を共有したい場合は、それを静的にする必要があります

class parents{
    public static $a;
    function test(){
        $child = new child();
        echo self::$a;
    }
}

class child extends parents{
    function __construct(){
        self::$a = 1;
    }
}
$new = new parents();
$new->test();

これはおそらくあなたが望むものではありません。または、変数を変更する場所を正確に伝えます

class parents{
    public $a;
    function test(){
        $child = new child();
        echo $child->a;
    }
}

class child extends parents{
    function __construct(){
        $this->a = 1;
    }
}
$new = new parents();
$new->test();
于 2013-07-25T16:05:26.067 に答える
0

これは、最初の例で子をインスタンス化するためです

$new = new child();//print 1

次に、親をインスタンス化します

$new = new parents();

2 番目は $new = new child(); を使用して最初と同じように機能します。

child() をインスタンス化して $a にアクセスしたい場合は、次のようにする必要があります。

class parents{
    public $a;
    function test(){
        $child = new child(); //CHANGE HERE
        echo $child->a;
    }
}

class child extends parents{
    function __construct(){
        $this->a = 1;
    }
}
$new = new parents();
$new->test();
于 2013-07-25T16:04:38.757 に答える
0

をインスタンス化すると、作成されparentたのインスタンスがクラスを関数にchild拡張します。ただし、それは の値を変更しません。parenttest()$a

于 2013-07-25T16:04:53.337 に答える