2011-01-21 5 views
1

私は自分のカスタムmvcシステムを作る方法を学んでいます。これまでのところ、私はルータとコントローラのようなものを作りました。ルータからカウントコントローラargsを取得しますか?

例をHERES

class Profiles 
{ 
    function index($args1,$args2) 
    { 
     echo var_dump($args1,$args2); 
    } 
} 

は、メソッドを実行し、私のルータクラスの一部とPARMS

 if (is_callable(array($controller,$method))) { 
      call_user_func_array(array($controller, $method), $this->params); 
     } 
あるwww.helloworld.com/args1/args2/args3私はコントローラプロファイルクラスとURLを持っています

今のところエラーはどういうわけか、私は$this->params iはcall_user_func_array(array($controller, $method), $this->params);

で呼び出す方法で count(params)その後、異なる場合は404を与える必要がありません

ok何が考えられているのですか?countがparamsを呼び出したクラスのcount個のparamsと同じでない場合、404、 は私に$ this-> paramsを数えることができますが、呼び出されたクラスのparamsはどうでしょうか? ? どうすればはcall_user_func_arrayで呼び出されたクラスのparamsをカウントできますか?私が知っているから

アダムラマダン

+0

はおそらく404これはオプションの引数を考慮していないこと「が見つかりませんエラー」 – davin

答えて

1

で探しについて

おかげで、reflectionを使用せずに、メソッドのパラメータの数を取得する方法はありません。しかし、それは非常に簡単だし、次のようになります。

$reflector = new ReflectionClass('Profiles'); 
$method = $reflector->getMethod('index'); 
$parameters = $method->getParameters(); 

printf('%s expects %d parameters', $method->name, count($parameters)); 

は反射が常にコストが付属していることを

index expects 2 parameter 

注意を得られます。ただし、これがパフォーマンスに与える影響は目立つべきではありません。

+0

ノートで、500「内部サーバエラー」でなければなりません。また、必要なものがすべてカウントであれば、すべてのReflectionParametersを取得するのはなぜですか? – abesto

+0

@abestoこれは、彼が反射で何ができるかを説明するためのものです。おそらく、彼はパラメータ名または何か他のものと一致させたいでしょう。 – alexn

+0

いいえ、得点: – abesto

1

あなたは、リフレクションを使用することができます。

$refclass = new ReflectionClass($controller); 
$param_count = $refclass->getMethod($method)->getNumberOfRequiredParameters(); 
if ($param_count <= count($this->params)) { 
    $refclass->invokeArgs($controller, $this->params); 
} else { 
    // 404 
} 

は、あまりにも多くのパラメータがあるかどうかをチェックすることにより、より厳しく行うことができます。実際にcall_user_func_arrayによると呼ばれるクラスで

+0

getNumberOfRequiredParameters私はそれを知らない。 –

0

カウントのparams

むしろシンプル、。パラメータの量は、func_get_args、次にcountを使用して配列にフェッチすることで決定できます。例:

<?php 
function foo() { 
    echo "I have received " . count(func_get_args()) . " parameters."; 
} 
foo(); // I have received 0 parameters. 
foo(1, 2, 3, 4, 5); // I have received 5 parameters. 
+0

ああ、それは期待された数のパラメータであるということにはならなかった。その場合、私の例は間違っています、ごめんなさい。 –

関連する問題