2016-06-22 10 views
1

は、私は、このような用語がある場合には全くわからないが、ここで私は、私はすべての内側のクラスをバイパスし、親に関数を呼び出したいPHPコールスーパー親メソッド

class A { 
    function a($a) { 
     return $a; 
    } 
} 

class B extends A { 
    function a($a) { 
     return parent::a('B' . $a); 
    } 
} 

class C extends B { 
    function a($a) { 
     return superparent::a('C' . $a); 
    } 
} 

$c = new C(); 
echo $c->a('C'); // "CC" 

をやりたいです初めて定義された場所 - これは可能ですか?

+2

これはコードのにおいのように感じています。クラスCは、クラスAについて何も知ってはいけません。それが存在することを知るべきではありません。異なることをしている場合は、代わりに別の方法を実行する必要があります。 –

答えて

6

いいえ、それはひどい考えです。すべてのクラスCは、それがBを拡張していることを知っています。それは、もし何かがあれば、Bが何を知っているのか知るべきではない。 Cは、何かを拡張するBに数えることはできません。また、その祖父母の特定のメソッドとその実装の詳細を認識する必要もありません。明日、Bをリファクタリングして別のクラスを拡張したり、クラスをまったく拡張したりすることはできません。このような3クラスクロスオーバーの依存関係を確立した場合、コードは左右に分割され始めます。

クラスは、継承または依存性注入のいずれかによって直接関連付けられているピアとのみ対話する必要があります。

ただ、論理的に話す:Bは「それB作る」ためにAの動作に必要な何かを追加し、CはそれC作るために何かを追加します。 CBを基に作成されていますので、何でもBCと同じです。 Cを「ジャンプする」BAに戻すと、ロジックと責任の割り当てがクラス階層に混在していることがわかります。あなたがあなたがA::a('C' . $a)と呼んで親の方法を選択することができ、Bみようと

-1

私の事。

このような親関数を呼び出すと、それは静的に呼び出されるのではなく、parent::a()のようになります。任意のエンジニアリングソフトウェアの苦情のにもかかわらず

+0

これはクラスデザインの回避策ですが、その質問にはほとんど答えません。 – deceze

-1

それを上書きcは、抽象として「A」を作ることができ

+3

いいえ、それは 'parent :: a()'のように静的に呼び出されません。クラスAで宣言された関数の中で '$ this'コールを使って試すことができます。 –

+3

これはすべて技術的に真実ですが、実際にはやっていることはまだひどいことです。 – deceze

2

(何をやろうとしていることは他のいくつかのアプローチによって達成されなければならないものです)私は私の両方の例が動作するようにsuposedたことを考えた:形質を使用

<?php 

trait Bypass_trait { 
    public function super_ref() { 
     return parent::super_ref(); 
    } 
} 

class A { 
    function a($a) { 
     return $a; 
    } 

    function super_ref() { 
     return $this; 
    } 
} 

class B extends A { 
    use Bypass_trait; 

    function a($a) { 
     return $this->super_ref()->a('B' . $a); 
    } 
} 

class C extends B { 
    use Bypass_trait; 

    function a($a) { 
     return $this->super_ref()->a('C' . $a); 
    } 
} 

$c = new C(); 
echo $c->a('C'); // "CC" 

使用して、インターフェイスは:

<?php 

interface Bypass { 
    public function super_ref(); 
} 

class A implements Bypass { 
    function a($a) { 
     return $a; 
    } 

    function super_ref() { 
     return $this; 
    } 
} 

class B extends A implements Bypass { 
    function a($a) { 
     return $this->super_ref()->a('B' . $a); 
    } 

    function super_ref() { 
     return parent::super_ref(); 
    } 
} 

class C extends B implements Bypass { 
    function a($a) { 
     return $this->super_ref()->a('C' . $a); 
    } 

    function super_ref() { 
     return parent::super_ref(); 
    } 
} 

$c = new C(); 
echo $c->a('C'); // "CC" 
関連する問題