2016-10-30 7 views
1

私は__call()でいくつかの混乱があると私はそれについての検索すべてが、それは結果は私がCしかしB取得のエコーの関数を呼び出すことであるように私が欲しいもの、だから、PHP - __call()混乱

<?php 

class A { 

    abstract public function C(); 

    private function B(){ 
     echo "B"; 
    } 

    public function __call($method,$arguments){ 
     if(method_exists("C", $method)) { 
      $this->B(); 
      return call_user_func_array(array("C",$method),$arguments); 
     } 
    } 
} 

class B extends A{ 

    public function C(){ 
     echo "C"; 
    } 
} 

$b = new B(); 
$b->C(); 

//the result I get: 
// C 
//the result I want; 
// BC 
?> 

を動作するはずです私に語りました最初に出てください。ある時点でうまくいきましたが、私は何が起こっているのか本当に混乱しています。 PHPのマニュアルでは、少なくとも私がやろうとしていることではないことも明らかです。

ノート:ほとんどの混乱があり、上記の__callメソッドは、私がそこにテストメッセージをすれば、それを印刷しない、もはやreponsiveではありません。

このように、私はいくつかの魔法の瞬間に動作するようにしました。誰かが私が間違ってやっていることを指摘できますか、それとも可能でしょうか? 。(それは、シナリオを変更している場合がありますので、私は、時間をかけていくつかのものを変更した

+0

を行う必要があります動作するように取得するには、クラス

$b = new B(); $b->C(); 

B()を呼んでいるあなたが実際に私はあなたが尋ね追加した – Machavity

+0

@Machavityこれらの関数を呼び出すコードを表示してくださいこれは、私が持っているシナリオです。 – Nytrix

+0

オブジェクトコンテキストでアクセスできないメソッドを呼び出すと '__call()が呼び出されます.'' C() 'メソッドについては何もアクセスできない –

答えて

2

を、私はあなたが__callが何をするか混乱していると思います。それはアクセスできないメソッドのためだ。それでは見てみましょうA

class A { 

    abstract public function C(); 

    private function B(){ 
     echo "B"; 
    } 

    public function __call($method,$arguments){ 
     if(method_exists("C", $method)) { 
      $this->B(); 
      return call_user_func_array(array("C",$method),$arguments); 
     } 
    } 
} 

今、あなたのB()privateですが、あなたの子供でC()

class B extends A{ 

    public function C(){ 
     echo "C"; 
    } 
} 

ないという問題が、あなたのコードがB()方法に触れることはありません。あなたは__callはあなたが

$b = new B(); 
$b->B(); // invokes __call() 
+0

オクラホマ、私はこれで作業することができます!私はちょっとこの方法に混乱していたことをタイトルが示してくれてありがとう、ありがとう。 – Nytrix