クラスの名前空間を自動的に取得するにはどうすればよいですか?
マジック変数___NAMESPACE__
_は、サブクラスで正しく定義されていないため、信頼できません。
例:
_class Foo\bar\A
_-> ___NAMESPACE__
_ === Foo\bar
_class Ping\pong\B extends Foo\bar\A
_-> ___NAMESPACE__
_ === Foo\bar(Ping\pongである必要があります)
ps:___CLASS__
_を使用して同じ間違った動作に気づきましたが、get_called_class()
...を使用して解決しました。get_called_class_namespace()
のようなものはありますか?どうすればそのような機能を実装できますか?
更新:get_called_class()
が完全修飾クラス名を返すことに気付いたので、解決策は私自身の質問にあると思います。したがって、そこから名前空間を抽出できます:D ...とにかく、より効果的なアプローチは私に知らせてください;)
class Foo\Bar\A
の名前空間はFoo\Bar
であるため、__NAMESPACE__
は非常にうまく機能しています。探しているのは、おそらく名前空間クラス名で、echo __NAMESPACE__ . '\\' . __CLASS__;
に参加することで簡単に取得できます。
次の例を考えてみましょう。
namespace Foo\Bar\FooBar;
use Ping\Pong\HongKong;
class A extends HongKong\B {
function __construct() {
echo __NAMESPACE__;
}
}
new A;
非常に正しいFoo\Bar\FooBar
を出力します...
そして、あなたがそうしても
namespace Ping\Pong\HongKong;
use Foo\Bar\FooBar;
class B extends FooBar\A {
function __construct() {
new A;
}
}
Foo\Bar\FooBar
をエコーしますが、これも非常に正しいです。
EDIT:ネストしているメイン内のネストされたクラスの名前空間を取得する必要がある場合は、次を使用します。
namespace Ping\Pong\HongKong;
use Foo\Bar\FooBar;
class B extends FooBar\A {
function __construct() {
$a = new A;
echo $a_ns = substr(get_class($a), 0, strrpos(get_class($a), '\\'));
}
}
PHP 5.5では::クラスが利用可能で、10倍簡単になります。例:A::class