微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用PHP变量实例化一个类 – 命名空间的问题

以下所有示例都基于所有文件都存在于正确位置的保证.我高音检查过这个.

(1)这在不使用命名空间时有效:

$a = "ClassName";
$b = new $a();

这不起作用:

// 'class not found' error, even though file is there

namespace path\to\here;
$a = "ClassName";
$b = new $a();

这个工作:

namespace path\to\here;
$a = "path\to\here\ClassName";
$b = new $a();

因此,当使用变量实例化类时,似乎忽略了名称空间声明.

有没有更好的方法(比我上一个例子)所以我不需要经历一些代码并更改每个变量以包含命名空间?

解决方法:

命名空间始终是完整类名的一部分.使用一些use语句,您只能在运行时为类创建别名.

<?PHP

use Name\Space\Class;

// actually reads like

use Name\Space\Class as Class;

?>

类之前的名称空间声明只告诉PHP解析器该类属于该名称空间,对于实例化,您仍需要引用完整的类名(包括如前所述的名称空间).

要回答您的具体问题,不,没有比您的问题中包含的最后一个示例更好的方法.虽然我用双引号字符串来逃避那些坏的反斜杠.*

<?PHP

$foo = "Name\\Space\\Class";
new $foo();

// Of course we can mimic PHP's alias behavIoUr.

$namespace = "Name\\Space\\";

$foo = "{$namespace}Foo";
$bar = "{$namespace}Bar";

new $foo();
new $bar();

?>

*)如果使用单引号字符串,则无需转义.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐