Php 相对名称空间和调用_user_func()

Php 相对名称空间和调用_user_func(),php,namespaces,Php,Namespaces,代码胜过文字: namespaces.php: 在回调中必须使用完全限定的类名 看 在当前版本的PHP中,使用字符串引用类名时,需要使用完整的命名空间对其进行完全限定。这不太好,但事实就是这样 在即将发布的PHPV5.5中,它们将包括一个解决此问题的功能,通过提供一个新的Classname::class语法,您可以使用它来代替将FQN Classname放入字符串中 有关这方面的更多信息,请参见此处的相关PHP RFC页面: 您的代码如下所示: return call_user_func([mo

代码胜过文字:

namespaces.php:


在回调中必须使用完全限定的类名


在当前版本的PHP中,使用字符串引用类名时,需要使用完整的命名空间对其进行完全限定。这不太好,但事实就是这样

在即将发布的PHPV5.5中,它们将包括一个解决此问题的功能,通过提供一个新的
Classname::class
语法,您可以使用它来代替将FQN Classname放入字符串中

有关这方面的更多信息,请参见此处的相关PHP RFC页面:

您的代码如下所示:

return call_user_func([models\$name::class,"getInstance"]);

这可能不准确;我没有5.5的副本可供测试和确认。但是无论哪种方式,新语法都会使像您这样的用例变得更好。

我相信这是出于设计。同样的规则也适用于
defined()
constant()
等函数。请检查。我在询问之前看过此手动输入,但我认为它只是一个示例,现在很清楚这是一个规则。。。有时他们缺乏更好的文档注释。谢谢!:)我得承认我完全错过了手册中的那一节。。。再次感谢您指出这一点,下次我在阅读手册时会更加注意!)很高兴知道他们意识到这一点,并使我们的情况变得更好,谢谢你提供的信息!:)
<?php

require_once 'namespaces.php';

foo\factory::create('test');
<?php

namespace Foobar;

class Foo {
    static public function test() {
        print "Hello world!\n";
    }
}

call_user_func(__NAMESPACE__ .'\Foo::test'); // As of PHP 5.3.0
call_user_func(array(__NAMESPACE__ .'\Foo', 'test')); // As of PHP 5.3.0
return call_user_func([models\$name::class,"getInstance"]);