2011-07-27 13 views
6

私は非常に簡単だと思っていたことをやろうとしていますが、PHPのOOPに比較的新しいので少し問題があります。子クラスの保護された変数の値を変更する

<?php 
class MyClass 
{ 
    protected $variable = 'DEFAULT'; 

    function __construct($newVariable) 
    { 
     $this->variable = $newVariable; 
     echo $this->variable; 
    } 
} 
class OtherClass extends MyClass 
{ 
    function __construct() 
    { 
     echo $this->variable; 
    } 
} 

$foo = new MyClass('MODIFIED'); // Output : MODIFIED 
$bar = new OtherClass(); // Output : DEFAULT 
?> 

は、私は別のスレッドや多くのウェブサイトを検索するが、私は多分子クラスに$変数の再定義値を渡すことができるか発見していない:

は、ここに私のコードです。 誰かが私を導くことができますか?方法があれば。

ありがとうございます。私は、フォームを作成するクラスを持っている 、そのクラスに我々が何であるかエンバイロメント内の関数を伝えるいくつかの変数があります:もし、実際に私はこの問題を抱えているスクリプトの中で何が起こっているのかを明確化

EDITそれは多言語形式かどうか、私は単純なフォームまたは構造化されたもの、そのようなパラメータが必要な場合。 これらの環境変数のいくつかは、その関数によってクラスの実行によって変更されます。

私のページの必要性のため、「選択」フィールドの作成専用の子クラスがあります。メインクラスのコア関数を継承してフィールドなどを作成しますが、子クラスにはさらにいくつかのパラメータが必要です。 これは、メインクラスのenvironnementパラメータを、選択されたクラスが継承したままの状態であることを示します。

私はこれを入力しているので、私はそれを行う正しい方法ではないかもしれないことに気づいています。私のコードを見ると、そうする別の方法があると思います。私のコードでは、私はそれが1つだけである必要がある2つのオブジェクトを持っていますが、実際にどのように配置するのかは本当にわかりません。

+1

変数を再定義するのではなく、親コンストラクタで変数を設定するだけです。あなたが必要としているものをあなたに呼んでください。 – hakre

+0

ここでは、OOPは関数とそのデフォルト変数の単なる継承です。それは魔法のように2つのオブジェクトをつなぎ合わせるのではない。悲しいことに。 –

答えて

2

あなたは変数を再定義していません。あなたはそれを親コンストラクタに設定するだけです。それを呼び出して、あなたが必要なものを持っている(コード内のコメントを参照してください、それだけで1行です):あなたは二つのクラス定義を持っている場合でも

<?php 
class MyClass 
{ 
    protected $variable = 'DEFAULT'; 

    function __construct($newVariable) 
    { 
     $this->variable = $newVariable; 
     echo $this->variable; 
    } 
} 
class OtherClass extends MyClass 
{ 
    function __construct() 
    { 
     parent::__construct(); # <<--- do this 
     echo $this->variable; 
    } 
} 

$foo = new MyClass('MODIFIED'); // Output : MODIFIED 
$bar = new OtherClass(); // Output : MODIFIED 
?> 

、具体的なインスタンスは常に一つのクラスのものであろう。その1つのクラスは親クラスから継承できますが、(コンストラクタで行ったのと同じように)メソッドをオーバーライドすると、親クラスメソッドはオーバーライドされたため、と呼ばれることはありません。ただしparentキーワードでは、子の中から親のメソッドにアクセスできます。

+0

問題は、私がここで興味を持っているのは、 'MODIFIED'という値です。私が再びparent :: _構造体を呼び出すと、$ newVariableを指定する必要があります。そして、私が何を入れても、最初にMyClassに渡された価値ではありません。 全体的に私は子クラスに渡す必要のある変数をたくさん持っています。変数はMyClassの内部関数によって時々変更されていますが、実際に可能かどうか疑問に思っています。 –

+0

@Maxime:それは単なる相続物です。保護されたメンバーは親と子によってアクセス可能ですが、常に同じ変数です。したがって、子または親のコードがそれを変更しても、両方とも常に同じ変数にアクセスします。私はあなたの質問から私が見ることができないのであなたが実際に達成したいものをもっと教えなければなりません。継承を処理するには多くの方法がありますので、達成したいことをよりよく伝えてください。あなたが作ったときにそれを再定義することは起こりません。 – hakre

+0

ここでは、メインポストにコンテキストを追加しましたが、これらのすべての回答は、おそらく私がやりたいことに間違ったアプローチをとったと指摘しました。 –

1

MyClassのコンストラクタは、OtherClassに上書きされます。親コンストラクタはではなく、が自動的に実行されます。親コンストラクターを実行する場合は、をOtherClass::__constructに呼び出します。

MyClass::__constructにはパラメータがありますが、OtherClass::__constructにはパラメータがありませんので、もちろん問題はあります。それをこのように置くと、どのように価値が変わると思いますか...?

0

あなたは子クラスでparentへの呼び出しを追加する必要があります。

function __construct() 
{ 
    parent::__construct(); 
    echo $this->variable; 
} 

あなたは任意の関数であることを行うことができます。

function doSomethingAWESOME() 
{ 
    parent::doSomethingAWESOME(); 
    echo "I think that was awesome"; 
} 

そして基本的に、文はあなたが知っている「、になります私がそれを上回る前にあなたが親クラスでやろうとしていたことすべて?そうです、ここでそれをしてください。

もクール:

function doSomethingAWESOME() 
{ 
    echo "NEVER!!!"; 
} 

function parentSomethingAwesome() 
{ 
    // calls the parent class's definition of some doSomethingAWESOME 
    parent::doSomethingAWESOME(); 
} 
1

子クラスはメソッドとデフォルト変数を継承します。 $foo$barが2つの異なるオブジェクトであるため、新しいインスタンスを開始すると、ルートクラスのプロパティが継承されません。

$bar = new OtherClass("MODIFIED");を実行してから、parent::__construct($newVariable)を2番目の__constructに追加する必要があります。 (そしてそれぞれのパラメータ)

基本的には、新しいインスタンス($ fooと並行)が元の$ fooから変更されたインスタンスを "魔法のように"継承することは期待できません。それを渡す方法を見つける必要があります(したがって、親のコンストラクタを呼び出す)。

0

あなたがしたいことはそのままではできません:$ fooと$ barはクラスのインスタンスなので、それらの間にはリンクがありません。

建築の類推を使用するには、2つのクラスは建築計画のようなものです:家の計画と、ガレージ付きの家の計画です。あなたがしようとしていることは、あなたが家を建てる(クラスをインスタンス化する)、それに何らかのベッドを置く(いくつかの変数を設定する)ようなものです。それは起こりません。

関連する問題