2016-09-29 11 views
2

私の子クラスで親クラスのプロパティを変更しようとしていますが、私が期待している結果が得られません。 私はいくつかの研究(Change parent variable from child classのような)を行っていますが、問題を見つけることができません。子クラスを使用して親のプロパティを変更する方法

class A { 
    public $msg; 

    public function __construct() { 
     $this->msg = 'foo'; 
    } 

    public function setMessage($string) { 
     $this->msg = $string; 
    } 

    public function getMessage() { 
     var_dump($this->msg); // For demo purposes 
    } 

    public function triggerB() { 
     $b = new B; 
    } 
} 
class B extends A { 
    public function __construct() { 
     parent::setMessage('bar'); 
    } 
} 

$a = new A; 
$a->getMessage(); 
$a->triggerB(); 
$a->getMessage(); 

「foo」が2回出力され、「foo」「bar」になると思います。

誰でも私が間違っていることを私に説明することができますか、これをどのように修正することができますか?
私の実際のコードでは、子クラスがいくつかの$ _POST値を検証し、その結果をMain-classに返すようにします。親は子を使用して検証します。

+0

まず、コンストラクタを呼び出す場合は、paranthesisを使用します。 '新しいB()'第二に、あなたはインスタンスを作成している、彼らはお互いへの参照を持っていない。私はあなたがオブジェクト内で方向付けする目的ではない、_statically_を考えていると思います。 – dbf

答えて

3

あなたはオブジェクトAを持っていて、そのインスタンスを作成してグローバルスコープ内の変数$aに格納しています。そして、クラスBの別のインスタンスを作成し、メソッドtriggerB()の範囲にある変数$bに格納しています。

他のクラスBに引数を渡す場合にのみ、親クラスAのプロパティを変更できます。

だから、このようなもので十分です:

<?php declare(strict_types = 1); 
class A { 
    public $msg; 

    public function __construct() { 
     $this->msg = 'foo'; 
    } 

    public function setMessage(string $string) { 
     $this->msg = $string; 
    } 

    public function getMessage() { 
     var_dump($this->msg); // For demo purposes 
    } 

    public function triggerB() { 
     (new B($this)); 
    } 
} 
class B { 
    public function __construct(A $a) { 
     $a->msg = "bar"; 
    } 
} 

$a = new A; 
$a->getMessage(); 
$a->triggerB(); 
$a->getMessage(); 

このアプローチでは、読みやすさと優れた依存関係の管理に適しています。


別のアプローチ:

<?php declare(strict_types = 1); 
class A { 
    public $msg; 

    public function __construct() { 
     $this->msg = 'foo'; 
    } 

    public function setMessage(string $string) { 
     $this->msg = $string; 
    } 

    public function getMessage() { 
     var_dump($this->msg); // For demo purposes 
    } 

    public function triggerB() { 
     $this->msg = 'bar'; 
    } 
} 
class B { 
    public function __construct(A $a) { 
     $a->msg = "bar"; 
    } 
} 

$a = new A; 
$a->getMessage(); 
$a->triggerB(); 
$a->getMessage(); 

これは賢明な、より良い性能ですが、複雑な何かをしようとしている場合は、最初の方法が優れています。


注:上記のコードはPHP7用です。

+0

ありがとう、このパフォーマンスにはどのような賢明さがありますか?そしてこれは良い習慣ですか?奇妙に思える。 – Rick

+0

可能な最良の方法は、 'triggerB()'と同じメソッドでクラスのプロパティを設定することです。 - 'public function triggerB(){$ this-> msg = 'Bar'; } 'しかし、何か複雑なやり方で処理しようとするなら、コードの可読性がパフォーマンスよりも重要であり、このアプローチがより適しています。 – Ikari

1

あなたtriggerB()方法は、実際には何もしません。

public function triggerB() { 
    $b = new B; 
} 

あなたは、新しいオブジェクトを作成し、$b変数にそれを割り当てています。メソッドが終了すると、変数/オブジェクト$bは存在しなくなります。

メソッド内の変数$bは、グローバルスコープ内の変数$aとは関係がありません。したがって、そのプロパティを設定しても$aには影響しません。

関連する問題