2011-09-19 7 views
12

私はその子のプロパティにアクセスするには、親クラスが必要になります。$_fieldsは子スコープから変更された場合アクセスの子プロパティ

class Parent { 
    private $_fields = null; 

    public function do_something() { 
    // Access $_fields and $child_var here 
    } 
} 

class Child extends Parent { 
    private $child_var = 'hello'; 
} 

$child = new Child(); 
$child->do_something(); 

、それはまだ親スコープでnullです。 $this->child_varを使用して親スコープから$ child_varにアクセスしようとすると、もちろんそれは未定義です。

私は

+4

をあなたはおそらく代わりに 'private'のプロパティ' protected'を作りたいです。 –

答えて

9

visibilityについての記事を見てみましょう...ちょうど子クラスにコピーされる「機能設定」のような何かを見つけることができませんでした。

基本的には、親のprivateプロパティ/メソッドにアクセスすることはできません。ただし、代わりにプロパティ/メソッドprotectedを宣言することができます。

class Parent { 
    protected $_fields = null; 

    public function do_something() { 
     // Access $_fields and $child_var here 
    } 
} 

class Child extends Parent { 
    protected $child_var = 'hello'; 
} 

$child = new Child(); 
$child->do_something(); 
+0

ありがとうございます!それはまさに私が探していたものでした。私はその文書を十分に読んでいないようだ。 –

6

親(親)クラスから子の値にアクセスしようとするのは悪い設計です。将来、親クラスに基づいて別のクラスを作成する場合は、親クラスでアクセスしようとしている特定のプロパティを作成することを忘れてしまいますか?

あなたは親クラスでプロパティを作成し、子供にそれを設定する必要があり、そのような何かをする必要がある場合:

class Parent 
{ 
    protected $child_var; 

    private $_fields = null;  
    public function do_something() 
    {  
     // Access $_fields and $child_var here 
     //access it as $this->child_var 
    } 
} 
class Child extends Parent 
{ 
    $child_var = 'hello'; 
} 

$child = new Child(); 
$child->do_something(); 

基本的にので、あなたは、子供特有のコンテンツを参照するべきではありません親にそれがそこにあると確信することはできません!

あなたは、あなたが抽象使用する必要がありますする必要がある場合:

PHP Abstraction

+0

まあ、それは悪い習慣だが、本当にそれが必要な非常に特殊なケースだと分かっている。とにかくあなたの答えをありがとう。 –

+0

私はこの問題を理解していますが、このソリューションはまだ私を危険にさらしています。特定のプロパティを定義するために、どのように子クラスを適用できますか?私は特定のプロパティを必要とする抽象親クラスで具体的な関数を持っています。今、私は親クラスで$ this-> childPropertyを使用していますが、それはあなたが強調した同じ問題を実行します。 –

+0

あなたは '$ child_var'要約を作ることができます。これは実際にそれを実装するすべての子供を強制するでしょう。 –

関連する問題