我正在操纵同一个文件来管理两个外部api类.
一个api类基于命名空间,另一个不是.
我想做的是这样的事情:
if($api == 'foo'){
require_once('foo.php');
}
if($api == 'bar'){
require_once('bar.php');
use xxxx\TheClass;
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我这样做时,会返回以下错误消息:
Parse error: syntax error, unexpected T_USE in etc...
Run Code Online (Sandbox Code Playgroud)
问题1:我是否必须使用两个不同的文件来管理这两个类,或者在文档中使用名称空间时是否可以同时管理它们?从我看来,它似乎不是.
问题2:为什么命名空间不能在if()语句中使用?
谢谢您的帮助
Phi*_*hil 12
请参阅用于导入的范围规则
use关键字必须在文件的最外层范围(全局范围)或命名空间内声明中声明.这是因为导入是在编译时完成的,而不是运行时,所以它不能是块作用域.
所有这些use都是将符号名称导入当前名称空间.我只是省略导入并使用完全限定的类名,例如
switch ($api) {
case 'foo' :
require_once('foo.php');
$someVar = new SomeClass();
break;
case 'bar' :
require_once('bar.php');
$someVar = new \xxxx\TheClass();
break;
default :
throw new UnexpectedValueException($api);
}
Run Code Online (Sandbox Code Playgroud)
您也可以简单地将use语句添加到脚本的顶部.添加它不会让您包含任何文件,也不需要知道符号,例如
use xxxx\TheClass;
switch ($api) {
case 'foo' :
require_once('foo.php');
$someVar = new SomeClass();
break;
case 'bar' :
require_once('bar.php');
$someVar = new TheClass(); // imported above
break;
default :
throw new UnexpectedValueException($api);
}
Run Code Online (Sandbox Code Playgroud)