使用关键字"use"有条件地导入类

rui*_*end 6 php conditional namespaces

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

if (condition) {

    use Symfony\Component\HttpFoundation\Response;

}
Run Code Online (Sandbox Code Playgroud)

laf*_*for 8

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

use关键字必须在一个文件中(全球范围)或命名空间内声明的最外层范围声明.这是因为导入是在编译时完成的,而不是运行时,所以它不能是块作用域.


dec*_*eze 8

唯一的办法use别名一个类名.而已.而已.
而不必在脚本中重复编写完全限定的类名:

$q = new \Foo\Bar\Baz\Quux;
if ($q instanceof \Foo\Bar\Baz\Quux) ...
Run Code Online (Sandbox Code Playgroud)

你可以缩短到:

use Foo\Bar\Baz\Quux;

$q = new Quux;
if ($q instanceof Quux) ...
Run Code Online (Sandbox Code Playgroud)

因此,想要use有条件地使用是绝对没有意义的.它只是一个语法助手; 如果它可以有条件地使用你的脚本语法将变得模糊,这是没有人想要的.

它不会减少代码加载,因为代码只能通过require/ include调用或通过自动加载显式加载.后者是非常优选的,因为它只在需要时已经懒惰地起作用.

  • 这种切换不应该发生在切换*类名*的级别!你的一段代码应该清楚地知道两个不同的类名,然后有意识地**实例化一个**,然后你可以传递一个类或另一个类的实例。这就是正确的 OOP 多态性。 (2认同)