メソッドを動的にロードする __call() メソッドを作成しました。私が回避したい問題の 1 つは、__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);
}
}
}
問題は、1 つのパラメーターしか持たない配列を説明できることですが、一部のメソッドは __call() メソッドの動的な性質を制限する複数のパラメーターを取り込んでいます。
配列を動的に渡されるメソッド パラメータに変換するにはどうすればよいですか?
それで
array(0 => 'stuff1', 1 => 'stuff2');
として渡すことができます
$this->->helper->test($param1, $param2);
それ以外の
$this->helper->test($params);
現在の設計では、次のようなパラメーターにアクセスする必要があります
public function test($params)
{
print_r($params);
echo $param[0];
}
しかし、私はそれを伝統的な方法で使用したい
public function test($param1, $param2)
{
echo $para1 . " " . $param2;
}
一部のメソッドは 2 つ以上のパラメーターを取ることに注意してください。その理由は、私が作成したものではない従来のスタイルのクラス メソッドを含める場合、すべてのパラメーター呼び出しを配列インデックス ポインターに変換する必要があるからです。
編集:
答えの通り
return (method_exists($class, $method) ? call_user_func_array(array($this->$property, $method), $params) : $error);
これは機能しますか?