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

Php 在if/else语句中使用名称空间,php,namespaces,Php,Namespaces,我正在操作同一个文件来管理两个外部api类 一个api类基于名称空间,另一个不基于名称空间 我想做的是这样的: if($api == 'foo'){ require_once('foo.php'); } if($api == 'bar'){ require_once('bar.php'); use xxxx\TheClass; } 问题是,执行此操作时,将返回以下错误消息: Parse error: syntax error, unexpected T_USE in etc.

我正在操作同一个文件来管理两个外部api类

一个api类基于名称空间,另一个不基于名称空间

我想做的是这样的:

if($api == 'foo'){
   require_once('foo.php');
}
if($api == 'bar'){
   require_once('bar.php');
   use xxxx\TheClass;
}
问题是,执行此操作时,将返回以下错误消息:

Parse error: syntax error, unexpected T_USE in etc...
问题1:我必须使用两个不同的文件来管理这两个类,还是在文档中使用名称空间时可以同时管理这两个类?据我所见,情况似乎并非如此

问题2:为什么不能在if()语句中使用名称空间


谢谢你的帮助好的,只是确认我说的是真的。。试着这样做:

*Test_1.php*

$API = "test_1";
if ($API === "test"){

}elseif ($API === "test_1"){
    require ("test.php");
    $API = new daryls\testt;
}

$API->test();
test.php

运行此功能已顺利运行

请参阅

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);
}
您还可以简单地将
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);
}
Use语句应该放在任何可执行代码之前(您可以有名称空间、类、函数和常量定义)。实际上,它可以,只需要无条件地放在某个名称空间中,所以没有
if
s或函数内部。也不要害怕在顶部使用,它不会加载任何类或实例化对象。它仅作为稍后在执行过程中遇到时使用的别名

至于将它们放在一个文件中,一个文件中可能有多个名称空间,甚至全局名称空间:

<?php   
namespace
{
    class myclass{}
}
namespace mynamespace 
{
    class myclass{}
}

API类版本控制的另一个选项是有条件地将类名设置为变量

// Get class name
switch ($api_version) {
  case 'v0':
    // No class namespace
    $class = 'Handler';
    break;
  case 'v1':
    // Namespaced class
    $class = 'API\App\v1\Handler';
    break;
  case 'v2':
    // Namespaced class
    $class = 'API\App\v2\Handler';
   break;
 default:
   throw new Exception('Unknown API version: ' . $api_version);
}
// Get class object
$handler = new $class();

上次我检查时,这是可能的。也许你在bar.php中有错误?我已经在一个独立的文件中测试了bar.php,如果我在if()语句中包含“use”,就会抛出“syntax error,unexpected T_use”。我发布了一个带有一些解决方法的答案,我同意Phil的答案,这为我做了工作,感谢Daryl anywayTIL:
use
语句不会触发自动加载器,也不需要定义符号名称:)非常感谢Phil提供了非常清晰和详细的答案。现在这是有道理的,使用new\xxxx\TheClass()解决了这个问题。@Vincent在您发表评论之后,我添加了更多信息
// Get class name
switch ($api_version) {
  case 'v0':
    // No class namespace
    $class = 'Handler';
    break;
  case 'v1':
    // Namespaced class
    $class = 'API\App\v1\Handler';
    break;
  case 'v2':
    // Namespaced class
    $class = 'API\App\v2\Handler';
   break;
 default:
   throw new Exception('Unknown API version: ' . $api_version);
}
// Get class object
$handler = new $class();