7

PHPが、クラス(インスタンス)が特定の名前空間に属しているかどうかをチェックするネイティブな方法を提供しているかどうか疑問に思います。

それは実際には重要ではありませんが、私がこの質問をどのように思いついたのかを理解するためだけに:

ZF2を使用して、イベントのイベントハンドラーを取得しましたonDispatch。ただし、このハンドラーは、任意のモジュールの任意のコントローラーがディスパッチされるたびに呼び出されます。明らかに、このモジュールのコントローラーがディスパッチされている場合にのみ、このハンドラーでアクションを実行したいと思います。

そこで、コントローラーがモジュールの名前空間内にあるかどうかを確認したかったのです。

ところで、私はクラス名()の文字列比較を使用してこれを一時的に解決しましたstrpos($className, 'ModuleName\Controller') !== falsesubstr()またはのようなものを使用するとstrncmp()、よりもパフォーマンスが向上するとstrpos()思いますが、私の場合はそれほど重要ではありません。

前もって感謝します!

//編集:明確にするために、私は次のようなものを探しています:

// $foo is an instance of MyApp\Controller\Moo
is_in_namespace('MyApp\Controller', $foo); // true

また

// $foo is an instance of MyApp\Controller\Moo
get_namespace($foo) === 'MyApp\Controller'; // true
4

3 に答える 3

6

を使用get_class()してオブジェクトのクラスを取得し、それを使用strops()して名前空間が含まれているかどうかを確認できます。同等のget_namespace()機能はありません。

例:

function is_in_namespace($namespace, $object) {
    return strpos(get_class($object), $namespace . '\\') === 0;
}
function get_namespace($object) {
    $class = get_class($object);
    $pos = strrpos($class, '\\');
    return substr($class, 0, $pos);
}
于 2013-01-08T15:37:33.180 に答える
1

定数__NAMESPACE__を使用して、現在の名前空間を取得できます

namespace MyProject;

echo '"', __NAMESPACE__, '"'; // outputs "MyProject"
于 2013-01-08T15:26:50.860 に答える
1

はい、ReflectionClassにはgetNamespaceName()があります:

(new \ReflectionClass($foo))->getNamespaceName();
于 2019-09-25T01:58:07.120 に答える