2012-01-13 37 views
0

次の状況が起こる可能性があるのか​​どうか疑問に思っていましたが、私はPHPマニュアルのマニュアルを読んでいますが、私にとってはあまり明確ではないので、PHPクラス拡張

だから私は、例えば一つのクラスています

class SomeClass { 
    public function someFunction() { 
     ... 
    } 
} 

そして、それの延長:

class Extension extends SomeClass { 
    public function someOtherFunction() { 
     ... 
    } 
} 

私の質問は、私は両方の上のクラス内のパブリック関数を使用することができる可能性があり、メインクラスの関数は拡張関数の中で、それ以外の方法は?

私はそれをどのようにしていますか?

答えて

1

あなたが拡張(子)クラスであなたの親のpublicprotected機能を使用することができます。

class Extension extends SomeClass 
{ 
    public function someOtherFunction() { 
     $foo = $this->someFunction(); // from parent class 
     return $foo; 
    } 
} 

クラス「拡張」が作成されると、あなたが変更することができ、「工ass」のその基本的にコピーを新しい関数を追加したり、親クラスの関数を上書きしたりすることができます。

親は拡張機能を知らない(例えば、 "JSONRequest extends Request"、 "XMLRequest extends Request"など)。親クラスは、そのような状況でどの子関数を呼び出すべきかを決して知ることができないので、親の中から拡張関数を呼び出すことは意味をなさない。このタイプの継承は、OOPとクリアなインタフェースの基本概念の1つです。

他の言葉で言えば、決して他の方法では動作しません。そして、それはすべきではありません。

+0

私は、基本的にメインクラスの中で拡張クラスの関数を使いたいのであれば、別のクラスを作るほうがいいでしょう。それが私が尋ねた理由ですが、別のクラスを作ることはできません。 – Roland

+0

方法があります。なぜあなたは 'SomeClass'を使ってみませんか? – Kaii

+0

あなたはSomeClassの中で必要な機能を定義することを意味しますか?はい、それは方法でしょうが、私はそれを分けたままにしておきたいと思いました。それぞれのクラスはお互いに関係なく、何か違ったことをしていました。 – Roland

3

Extensionクラスの両方の関数を使用できますが、SomeClassクラスのsomeFunction()のみ使用できます。

エクステンションは元のクラスを変更するものではなく、新しいクラスに組み込むだけです。

+0

はい、エクステンションは実際にはメインクラスの拡張です。私はPHPマニュアルから理解しましたが、拡張クラスの中で 'someFunction()'を使うことができますが、 'someOtherFunction () 'メインクラスの中で? – Roland

+0

Exactly:拡張は一方向の処理です。新しいクラスは古いクラスからすべてを取得しますが、古いクラスは何も得られません。変更されません。あなたの場合、古いクラスは新しい関数について知りません。 –