在if/else语句中使用命名空间

Vin*_*ent 7 php namespaces

我正在操纵同一个文件来管理两个外部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)