php - 我可以从 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 的交互式外壳中使用命名空间?如果根本不可能,有什么特别的原因吗?
解决方案
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 通常是靠近任何优先事项的顶部。
推荐阅读
- django - Django Auth:如何创建多对多关系模型?
- odoo - Odoo 12 - 类型错误:create() 缺少 1 个必需的位置参数:'vals'
- xamarin - 当 CrossSimpleAudioPlayer 播放时,WkWebView 暂时禁用
- firebase - 我正在使用流提供程序和 Navigator.push(),如何检测新路由中流的更改
- python - “ctypes\__init__.py”,第 364 行,在 __init__ OSError: [WinError 126] The specified module could not be found While running pyinstaller executable
- python - how to slice data frame by row number and aggregate in pandas
- android - 用户单击通知启动后台应用程序时如何获取Android推送通知有效负载
- vue.js - Vue.js:是否可以对 Vue 项目进行“条件编译”?
- r - 在我的函数中应用巴特利特测试时出错
- docker - "google cloud run" 将 CMD 的 HOME 更改为 /home,其中 RUN 使用 /root