0

私は現在 MVC を構築していますが、少し問題が発生しました (解決策は既にあります)。

これは失敗するためFatal error: Call to undefined method Controller_Home::DMVC_DEF_CTRL_FUNCTION()..

if(method_exists($Controller, DMVC_DEF_CTRL_FUNCTION)){
    $Controller->DMVC_DEF_CTRL_FUNCTION($SecondRoute);
} else {
    // 404
    die;
}

この作品 :

$MethodName = DMVC_DEF_CTRL_FUNCTION;
if(method_exists($Controller, $MethodName)){
    $Controller->$MethodName($SecondRoute);
} else {
    // 404
    die;
}

DMVC_DEF_CTRL_FUNCTION定数です。

なぜ定数が機能しないのか、誰かが私にこれを説明できますか? また、定数関数を試してみましたが、成功しませんでした。

PHPは関数だと思います。定数が関数ではないことをPHPに伝えるにはどうすればよいDMVC_DEF_CTRL_FUNCTIONですか?

ありがとう

4

5 に答える 5

2

メソッド名として定数値を使用する場合は、カーリー式の構文を利用できます。

 $Controller->{CONSTANT_NAME}($SecondRoute);

そうでなければ、識別子はメソッド名としてのみ解釈されます。

于 2012-04-27T17:09:30.317 に答える
2

現在のコードでは、インタープリターは、DMVC_DEF_CTRL_FUNCTIONという名前のオブジェクトでメソッドを呼び出していると考えています。DMVC_DEF_CTRL_FUNCTIONは定数であり、変数ではないため、phpは保持している実際の値ではなく名前を使用します。

次の方法で、代わりにphpに値を取得させることができます。

 $controller->{DMVC_DEF_CTRL_FUNCTION}( "Blah" );

アップデート

グローバル定数の代わりにクラス定数を使用する場合、以下も同様に機能します。

 $controller->{self::DMVC_DEF_CTRL_FUNCTION}( "Blah" );
于 2012-04-27T17:10:04.940 に答える
1

PHPは、変数がデータを保持していることを知っています。それが変数の目的です。これが、変数を評価することで、変数変数を使用して、実行しようとしているように関数を実行できる理由です。関数の実際の名前だけでなく、これを定数として使用するつもりだったことをどのように知ることができますか?

以下を使用して、同じ目的を実行できます。

if(method_exists($Controller, DMVC_DEF_CTRL_FUNCTION)){
    call_user_func(array($Controller, DMVC_DEF_CTRL_FUNCTION),$SecondRoute);
} else {
    // 404
    die;
}
于 2012-04-27T17:02:33.547 に答える
0

この行の場合:

if(method_exists($Controller, DMVC_DEF_CTRL_FUNCTION)){

以前にやったことがありますdefine('DMVC_DEF_CTRL_FUNCTION', 'some value')か?そうでない場合は、未定義の定数をチェックしています。

if (method_exists($Controller, NULL)){

method_exists()メソッドの名前をSTRINGとして渡す必要があります。パーツを引用していないのでDMVC...、定数として入力されます。つまり、事前に定義されている必要があります。

編集:

$x = 'hello';
define('x', 'goodbye');

$obj->x();  // this is NOT going to call hello() **OR** goodbye()
于 2012-04-27T17:03:21.910 に答える
0

PHP は、関数 DMVC_DEF_CTRL_FUNCTION を呼び出していないことを知りません。

function DMVC_DEF_CTRL_FUNCTION()
{
    // some function
}

クラッシュスピーダーは正しい。call_user_func を使用できますが、PHP が関数を呼び出す前に定数を置き換えるように指示しないのはなぜですか。

$Controller->{DMVC_DEF_CTRL_FUNCTION}($SecondRoute);

定数を括弧で囲みます。

于 2012-04-27T17:13:51.157 に答える