Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用关键字'有条件地导入类;使用';_Php_Namespaces_Conditional - Fatal编程技术网

Php 使用关键字'有条件地导入类;使用';

Php 使用关键字'有条件地导入类;使用';,php,namespaces,conditional,Php,Namespaces,Conditional,我从未在任何地方见过这种结构,所以我想知道这样一个表达式是否有问题: if (condition) { use Symfony\Component\HttpFoundation\Response; } 这将引发语法错误。来自TFM: 必须在文件的最外层范围内声明use关键字 (全局范围)或内部命名空间声明。这是因为 导入是在编译时完成的,而不是在运行时,因此无法进行 块作用域 使用所做的唯一事情就是别名类名。就这样。没别的了。 不必在脚本中重复写入完全限定的类名: $q = new

我从未在任何地方见过这种结构,所以我想知道这样一个表达式是否有问题:

if (condition) {

    use Symfony\Component\HttpFoundation\Response;

}

这将引发语法错误。来自TFM:

必须在文件的最外层范围内声明
use
关键字 (全局范围)或内部命名空间声明。这是因为 导入是在编译时完成的,而不是在运行时,因此无法进行 块作用域


使用
所做的唯一事情就是别名类名。就这样。没别的了。
不必在脚本中重复写入完全限定的类名:

$q = new \Foo\Bar\Baz\Quux;
if ($q instanceof \Foo\Bar\Baz\Quux) ...
您可以将其缩短为:

use Foo\Bar\Baz\Quux;

$q = new Quux;
if ($q instanceof Quux) ...
因此,有条件地使用
use
是毫无意义的。它只是一个语法助手;如果可以有条件地使用它,那么脚本语法就会变得模棱两可,这是没有人想要的


它不会减少代码加载,因为代码只通过
require
/
include
调用或通过自动加载显式加载。后一种方法非常受欢迎,因为它已经在需要的时候才懒散地启动。

基本上为什么需要它?使用条件的目的是什么<代码>使用不包括任何内容。根据文档,
导入是在编译时完成的,而不是运行时
,因此您不能这样做。看看php.net,毕竟这个问题不需要否决票。我希望@deceze的解释能帮助一些人。这是有道理的。假设我正在为后端API更换供应商。我希望能够从一个客户端切换到另一个客户端,而无需编写大量代码来实现swtich。假设我在环境变量中定义API供应商:
vendor=SignalWire
vendor=Twilio
在设置客户端连接的类中,我要初始化“正确的客户端”。加载正确供应商代码的有条件使用是完美的,这样我就不必在代码的其余部分有条件地使用可能有几十个“new”的类。切换不应该发生在关闭类名的级别上!一段代码应该清楚地知道两个不同的类名,然后有意识地实例化一个,然后可以传递一个或另一个类的实例。这是正确的面向对象多态性。是的,你是对的。我最终解决这个问题的方法是使用ClassA作为Foo;使用ClassB作为酒吧;然后根据环境有条件地返回正确实例化的类。是。这是正确方法的另一个原因是,构造函数可能非常不同。即使类的接口相同且可互换,如果它们需要不同的构造函数参数,代码中的某些内容也需要清楚地知道哪个类是哪个类,并且不能让PHP在语法级别进行切换。