私は、クロージャを導入した PHP 5.3 を使用しています。アプリ (およびフレームワーク) 全体でクロージャーを使用できるようになったので、 is_callable を使用してハンドラーの種類を確認します$callback
。
の場合$callback
is_callable
、私は十分に知っており、その関数/メソッド/クロージャを使用しています。呼び出し可能ではなく、文字列の場合は、おそらく$this
クラス内のメソッドの名前です。存在する場合と存在しない場合があります。PHPに任せると、致命的なエラーが「スロー」されます(私はそれが好きです)。
しかし、ミックスインを使用したいので、魔法のメソッドが必要__call
です。__call
実際の関数呼び出しの前にロジックを含めることができるため、非常にクールです。しかし...__call
呼び出されたメソッドが存在しない場合はどうなりますか? 確かに、例外をスローすることはできますが、それは後でわかります。
問題は、 の有用性ですis_callable
。これは、 を実装した後__call
、すべてにフォールバックがあるため ( である )、すべてが true を返すため__call
です。
動的メソッドと便利な両方を持つ方法はありis_callable
ますか?
私が見たいのは、呼び出された__is_callable
ときに PHP が「参照」する、ある種のキャッシュ可能な魔法のメソッドですis_callable(array($object, $method))
。
php.net では、これについて私と同じように頭を悩ませている人を見つけることができません。これはいけません!使ったらもう__call
使えis_callable
ない!?
私は何か意味がありますか?
PS。私は調べましmethod_exists
たが、それは十分ではありません (すべてのクロージャーとグローバル関数を除外できたとしても) パブリックと同様にプライベートおよび保護されたメソッドに対して true を返すためです。
編集ミックスインをチェックする「より良い」is_callableを
作成しましたが、かなり高価だと思います。