2011-11-12 15 views
1

基本的にこれは私が何をしたいです:拡張クラスへのクラスからPHPの変数を転送

<?php 
    class App { 
    public $var = "main-class"; 
    public function load() { 
     $this->var = "child-class"; 
     $child = new Child; 
     $child->echo_var(); 
    } 
    } 
    class Child extends App { 
    public function echo_var() { 
     echo $this->var; 
    } 
    } 

    $app = new Child; 
    $app->load(); 
?> 

それは変更することなく、私は、出力「子クラス」にそれをしたい、「メインクラス」を出力子クラス(それは私がそれを「クリーンでダイナミックなクラス」にしたいからです)。

私はアクション

PSの他のコースのための提案を受け入れる:これは私が開発しようとしている中小MVCフレームワークの一部です。

+0

これは正しくないようです。別の行動を提案するには、少しの文脈を提供する必要があります。 'load()'は正確に何をするのですか? – Vikk

+0

"models"という名前のグローバル変数があります。このように初期化されています: public $ models = array(); と私は現在のコントローラで使用されているクラスに従ってその配列に値を設定する関数を持っています。 $ this-> uses_class( "Thumbnail"); モデルに作用し、配列に追加します...子クラスを呼び出す前に、配列には追加するクラスがよく配置されますが、その後、$ models varはarray() –

答えて

1

これには2通りの方法があります。どちらもコンストラクタを使用する必要があります。最初のもので、子供が

<?php 
class App { 
    public $var = "main-class"; 

    public function __construct($var=null) { 
     if($var !== null) { 
      $this->var = $var; 
     } 
    } 

    public function load() { 
     $child = new Child(); 
     $child->echo_var(); 
    } 
} 

class Child extends App { 
    public function __construct(){ 
     parent::__construct("child-class"); 
    } 

    public function echo_var() { 
     echo $this->var; 
    } 
} 

$app = new Child(); 
$app->load(); 
?> 

を作成したときに、第2の1の親が子供の名前を宣言することができます自分自身を宣言します。

<?php 
class App { 
    public $var = "main-class"; 

    public function __construct($var=null) { 
     if($var !== null) { 
      $this->var = $var; 
     } 
    } 

    public function load() { 
     $child = new Child ("child-class"); 
     $child->echo_var(); 
    } 
} 

class Child extends App { 
    public function echo_var() { 
     echo $this->var; 
    } 
} 

$app = new Child(); 
$app->load(); 
?> 

これらの例はどちらもうまく動作していますが、私はそう信じています。

0

これは継承の仕組みではありません。新しいChildオブジェクトを作成すると、そのデータメンバーはすべてデフォルト値で初期化されます。親クラスで$this->var = ""を実行すると、$appオブジェクトのデータメンバーが設定され、$childオブジェクトは設定されません。

子クラスを変更して、パラメータを受け入れるコンストラクタを組み込むことができます。そのコンストラクタは、データメンバを適切に設定します。あなたが望むものに似たものを実現するには、コンストラクタを使用することができます。

<?php 
    class App { 
    public $var = "main-class"; 
    public function __construct() { 
     $this->var = "child-class"; 
    } 
    public function load() { 
     $child = new Child; 
     $child->echo_var(); 
    } 
    } 
    class Child extends App { 
    public function __construct() 
    { 
     parent::__construct(); 
    } 
    public function echo_var() { 
     echo $this->var; 
    } 
    } 

    $app = new App; 
    $app->load(); 
0

私はあなたの親クラスは、それが子供のinstanciatesこと、それは非常に奇妙見つけます。一般的に、あなたは子供をインスタンス化し、あなたは親のすべての機能を得ます。

$app = new Child(); 
$app->load(); 

問題は、あなたが実際に2つの異なるinstanciationsを持っているということです。あなたはAppのオブジェクトを持っていて、それはChildの別のオブジェクトを保持しています。

これを行うもう1つの方法は、$ varを静的変数にして、インスタンス化とは独立して使用できるようにすることです。私は一般的にプロパティを静的にすることを推奨していません。これは一般的に悪い形であると考えられています(多くの理由から)。

+0

にリセットされます。ごめんなさい! それはちょうどタイプミスでした... しかし、まだ、同じ結果。 –

関連する問題