4

アプローチ1は機能しますが、アプローチ2は機能しません-致命的なエラーが発生する可能性があります(関数名は...の文字列でなければなりません

# Approach 1
$function = self::$function and $function();

# Approach 2
self::$function and self::$function();

これは少し奇妙ではありませんか?誰かが説明してくれることを願っています。


編集:コンテキストを提供するために、クラス全体を次に示します。

class Example
{
    static $function;

    static function method()
    {
        self::$function();
    }
}

function callback() {}

Example::$function = 'callback';
Example::method();
4

3 に答える 3

1

アプローチ#1が機能する理由

これは、PHPの演算子の優先順位のアーティファクトです。

$function = self::$function and $function();

と同等です

($function = self::$function) and $function();

もちろんこれは同等です

$function = self::$function;
if ($function) $function();

最後の行は、変数関数の構文であるため、正常に機能します。

アプローチ#2が機能しない理由

コンパイラが「間違った方法」を解決するあいまいさが存在するためです。

このことを考慮:

self::$function();

これは、PHPがstaticプロパティに格納されているコールバックを呼び出す必要があることを意味しますか$function、それとも名前が変数の値である静的メソッドを呼び出す必要があることを意味します$functionか?

PHPは後者を使用しますが$function、スコープに変数がないため、最初に通知が表示され、次にエラーが発生します(文字列ではない、と$function評価されnullます)。

于 2013-03-02T22:41:48.890 に答える
1

構文は私にはあいまいに思えます。おそらくPHP用でもあります。関数名をローカル変数に保存する方が、よりクリーンで機能的です。

static function method()
  $method = self::$function;
  $method();
}

または使用call_user_func()

static function method()
  call_user_func(self::$function);
}
于 2013-03-02T22:20:35.817 に答える
1

優先順位とあいまいさの技術的な詳細に立ち入りたくない場合、簡単に説明self::$function()すると、 は と同じロジックに従って動作し$obj->$method()ます。$function()の変数関数を呼び出そうとしますself

于 2013-03-02T23:13:09.003 に答える