0
的命名空間關鍵字可用來顯式地請求從當前命名空間或子命名空間的元素。這是類的自我運算符的名稱空間。
我需要的靜態代替,即等同。如果一個類擴展我的類,那個名字空間。
這
return preg_replace('/.[^\\\\]+$/', '', get_class($object));
做,但它讓我傷心。
的命名空間關鍵字可用來顯式地請求從當前命名空間或子命名空間的元素。這是類的自我運算符的名稱空間。
我需要的靜態代替,即等同。如果一個類擴展我的類,那個名字空間。
這
return preg_replace('/.[^\\\\]+$/', '', get_class($object));
做,但它讓我傷心。
反射提供經由ReflectionObject->getNamespace()
這樣做的一種有效的方式,檢查以下的代碼:
namespace Foo {
class Bar {
public function getNamespace() {
return (new \ReflectionObject($this))->getNamespaceName();
}
}
}
namespace Baz {
use Foo\Bar as BaseClass;
class Bar extends BaseClass {}
}
namespace {
$bar1 = new Foo\Bar();
echo "ns1 is: ", $bar1->getNamespace(), '<br>';
$bar2 = new Baz\Bar();
echo "ns2 is: ", $bar2->getNamespace();
}
我不認爲有一個「晚期靜態命名空間」助手,你確實需要破解。
例如
<?php
namespace ProjectFoo;
class Foo {
public static function ns() { echo __NAMESPACE__; }
public static function getNamespace() {
return static::ns();
}
}
namespace ProjectBar;
use ProjectFoo\Foo;
class Bar extends Foo {
public static function ns() { echo __NAMESPACE__; }
}
$foo = new Foo();
$foo::getNamespace();
print "\n";
$bar = new Bar();
$bar::getNamespace();
print "\n";