文件 1 中的示例:
namespace A;
class Foo{
}
文件 2:
use A\Foo;
do_stuff('A\Foo'); // <- need namespace here :(
Foo::someStaticMethod(); // <- namespace not required :D
有什么方法可以在函数参数中传递类名,比如常量或其他东西,所以我不需要在命名空间前面加上?
更新 :)
当我知道时,我需要将某些类的类名作为字符串传递,我用于创建特殊的类常量
namespace Foo\Bar;
class A {
const __NAMESPACE = __NAMESPACE__;
const __CLASS = __CLASS__;
}
现在您可以引用类名,例如
use Foo\Bar\A as Baz;
echo Baz::__CLASS;
使用 PHP5.5,这将是内置的
echo Baz::class;
命名空间的完全限定名称 (FQN) 始终以命名空间分隔符开头
do_stuff('\A\Foo');
除了- 语句中的(这是唯一的例外)use
,因为只能出现完整的名称空间标识符,因此为方便起见,您可以在此处省略它。
但是,字符串是一个字符串,您将它用作类名的地方超出了解释器的范围,因此它失去了对前use A\Foo
一个别名的引用。使用 PHP5.5 你可以编写Foo::class
,但我认为现在不是一个选项;)
不,据我所知,不是没有追踪来电者。您正在调用的函数必须与您尝试传递的对象存在于同一命名空间中。
debug_backtrace
如果您需要命名空间解析,您可能想查看该函数。但这需要将文件路径转换为名称空间解析或类似内容。
然而这是可能的:(我看到安德鲁用相同类型的解决方案回答了。)
function doStuff ($obj)
{
$name = (is_object($obj))
? (new ReflectionClass(get_class($obj)))->getName()
: $obj;
// $name will now contain the fully qualified name
}
namespace Common;
class Test
{}
$testObj = new Test();
// This will work, but requires argument to be
// fully quialified or an instance of the object.
\doStuff($testObj);
\doStuff("\Common\Test");
您可以实例化一个新对象,然后调用 get_class() 来获取该类的完全限定名称。
use A\Foo;
$foo = new Foo();
do_stuff(get_class($foo)); // get_class($foo) = '\A\Foo'
这意味着 Foo 的命名空间仅由use语句定义(即更少的代码维护)。
或者你可以通过类反射。