首页 > 解决方案 > 我可以从 PHP 的 Interactive Shell 中的必需/包含文件中“使用”命名空间吗?

问题描述

假设我在 PHP 交互式 shell 中运行以下命令,需要一个实用函数文件,其中包含命名空间下的所有代码utils

php > require_once __DIR__ . '/utils.php';
php > echo \utils\doubleMe(2);
4
php > use \utils as u;
php > echo u\doubleMe(2);
PHP Warning: Uncaught Error: Call to undefined function u\doubleMe() in php shell code: 1
Stack trace: ...
php >

我可以毫无问题地使用完全限定的命名空间调用函数,但是,当我尝试use/alias 命名空间时,就好像它从未发生过一样,并尝试在别名命名空间错误下调用函数,说函数未定义。

我应该如何use在 PHP 的交互式外壳中使用命名空间?如果根本不可能,有什么特别的原因吗?

标签: phpinteractive-shell

解决方案


PHPuse语句本质上是编译器对缓冲区中的所有代码执行复制粘贴操作。所以

use Foo\Bar\Baz as F;
new F();

变得公正

new \Foo\Bar\Baz();

在它被解释之前。

在标准流程中,编译器一次对单个文件进行操作,因此 use 语句适用于给定文件中的所有代码。但是对于交互式 shell,缓冲区只包含一行。我在评论中提到了这一点,但正如在这个答案中指出的那样,运行类似

use \DateTime as D; echo (new D)->format('c');

在交互式外壳中实际上可以正常工作,您会看到类似

2021-01-11T23:24:55+00:00

然而,将声明放在use自己的行上基本上不会有任何作用。编译器尝试运行其常规的“复制粘贴”例程,但是一旦完成,该语句的任何内容都不会保存在内存中,因此以后的行不会受到影响。

如果内部团队有足够的动力,我确信可以修复它,但我在错误跟踪器或内部邮件列表中找不到任何关于它的讨论,而且我不认为交互式 shell 通常是靠近任何优先事项的顶部。


推荐阅读