phpマジックメソッド_call

1405 ワード

__callはマジックメソッドの1つで、プログラムが現在のクラスで宣言されていないか、呼び出す権限がないメソッドを呼び出すと、__が呼び出されます.callメソッド
class test
{
  public function emptyFunc(){

    $getArgs = func_get_args();
    $funcName = $getArgs[0];
    //$params = array_slice($getArgs, 1);
    //var_dump($params);  // this is params                
    return $funcName . ' function is not exists';
  }

  public function __call($m, $params)
  {
     $arr[] = $m;
     $arr = array_merge($arr, $params);
     return call_user_func_array(array($this, 'emptyFunc'), $arr);
  }

  protected function nowToTest(){

    return 'this is nowToTest';
  }
}

$testObj = new test();
var_dump($testObj->nowToTest('params1','params1'));
//var_dump result => string(29) "nowToTest function is not exists"

以上のようにtestクラスではnowToTestメソッドは存在するが、このメソッドを修飾するのはprotected(保護)であるため、インスタンスが出てくるオブジェクトは実行権限がなく、そのときに_コール中です.
       _call()には2つのパラメータがあり、1つ目の$mは現在の呼び出しメソッドの名前であり、ここでは'nowToTest'であり、2つ目の$paramsは'nowToTest'メソッドを呼び出したときに入力されるパラメータである.$paramsに配列の形で結合します.
      call_user_func_array($method,$params)というphpメソッドの役割は$methodメソッドを呼び出すことであり,パラメータは$paramsであり,メソッドがクラスにある場合は上のような配列形式で呼び出せばよいが,ここではemptyFuncメソッドを呼び出す.func_get_args()の役割は,伝達されたすべてのパラメータを配列形式で取得することである.これらのパラメータは_callに入力された最初のパラメータはメソッド名です.最後に戻った結果は
"nowToTest function is not exists"