我可以在 PHP 的交互式 Shell 中 "use" 来自 required/included 文件的命名空间吗?

Can I "use" a namespace from a required/included file in PHP's 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/别名命名空间时,就好像它从未发生过一样,并尝试调用别名命名空间下的函数错误,说函数未定义。

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

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

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

变成了

new \Foo\Bar\Baz();

在它被解释之前。

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

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

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

的内容

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

但是,将 use 语句单独放在一行中,实际上什么也做不了;编译器尝试 运行 它的常规“复制粘贴”例程,但是一旦完成,关于该语句的任何内容都不会保留在内存中,因此以后的行不受影响。

如果 Internals 团队有足够的动力,我确信这是可以解决的问题,但我在错误跟踪器或 internals mailing list 中找不到任何关于它的讨论,我也不知道不认为交互式 shell 通常接近所有优先级的首位。