以下所有示例都基于所有文件都存在于正确位置的保证.我高音检查过这个.
(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 举报,一经查实,本站将立刻删除。