2012-04-21 7 views
1

メソッドを動的にロードするための__call()メソッドを作成しました。回避したい1つの問題は、__call()が呼び出しから渡されたすべてのパラメータの配列を作成するという事実です。これは、問題は私が唯一つのパラメータを有するアレイを占めることができるということです私のコード__call()を使用して複数の配列を取得するメソッドにパラメータを渡します。

public function __call($method, $params) 
{ 
    if (count($params) <= 1) 
      $params = $params[0]; 

    foreach (get_object_vars($this) as $property => $value) { 

     $class = '\\System\\' . ucfirst(str_replace('_', '', $property)) . '_Helper'; 

     if (strpos($method, str_replace('_', '', $property)) !== false) { 

      if (!in_array($class, get_declared_classes())) 
       $this->$property = new $class($params); 

      $error = $method . ' doesn\'t exist in class ' . $class; 

      return (method_exists($class, $method) ? $this->$property->$method($params) : $error); 
     } 
    } 
} 

ですが、私の方法のいくつかは、__call()メソッドの動的な性質を制限つ以上のパラメータに取ります。

どのように配列を動的に渡されるメソッドパラメータに変換できますか?

はそう

array(0 => 'stuff1', 1 => 'stuff2'); 

は私が

public function test($params) 
{ 
    print_r($params); 
    echo $param[0]; 
} 
などのパラメータにアクセスする必要があり、現在のデザインと

$this->->helper->test($param1, $param2); 

代わりの

$this->helper->test($params); 

として渡すことができます

が、私はいくつかの方法が2つの以上のパラメータを取ることを念頭に置いて

​​

維持、ビーイングは、私は、伝統的なスタイルのクラスメソッドが含まれている場合、私は私によって作成されていないということである理由のような伝統的な方法で使用して、それをしたいですすべてのパラメータ呼び出しを配列インデックスポインタに変換する必要があります。

EDIT:答え

return (method_exists($class, $method) ? call_user_func_array(array($this->$property, $method), $params) : $error); 

この作品は意志どおり

答えて

3

は、私はまだ前に私の機能を設計しています、call_user_func_array

call_user_func_array(array($this->$property, $method), $params); 

またはreflection

+0

私は元々持っていたようにメソッドを呼び出すのではなく、それを返すだろうか? – Eli

0

call_user_func_array()のように見えます。 This commentも便利です。

(また、だけではなく、エラー文字列を返すの例外を投げることを検討してください。)

+0

うん経由で行うことができます私は例外になる=) – Eli

関連する問題