php - 为什么 auto_prepend_file 在 php 的交互模式下不起作用?
问题描述
通过 composer 安装包并导入:
mkdir myproject
cd myproject
composer require metowolf/meting
mkdir public
touch public/index.php
在 index.php 中加载它:
cd public
vim index.php
<?php
require __DIR__ . '/../vendor/autoload.php';
use Metowolf\Meting;
$api = new Meting('netease');
显示项目目录结构:
tree myproject
myproject
├── composer.json
├── composer.lock
├── public
│ └── index.php
└── vendor
├── autoload.php
├── composer
│ ├── autoload_classmap.php
│ ├── autoload_namespaces.php
│ ├── autoload_psr4.php
│ ├── autoload_real.php
│ ├── autoload_static.php
│ ├── ClassLoader.php
│ ├── installed.json
│ └── LICENSE
└── metowolf
└── meting
├── composer.json
├── LICENSE
├── README.md
└── src
└── Meting.php
在浏览器中验证它 127.0.0.1/myproject/public
,它工作正常,包Megting
已加载。
现在,我想以交互模式加载它:
php -d auto_prepend_file=/home/debian/myproject/vendor/metowolf/meting/src/Meting.php -a
Interactive mode enabled
php > use Metowolf\Meting;
php > $api = new Meting('netease');
PHP Warning: Uncaught Error: Class 'Meting' not found in php shell code:1
Stack trace:
#0 {main}
thrown in php shell code on line 1
为什么 auto_prepend_file 在 php 的交互模式下不起作用?
解决方案
auto_prepend_file
确实在交互式外壳中工作。问题是use
关键字仅对当前行有效。
有了这个 prepend.php 文件:
<?php
namespace foo;
class Bar
{
function __construct()
{
echo 'Success';
}
}
?>
这有效(全类名称):
php -d auto_prepend_file=prepend.php -a 交互式外壳 php > 新的 foo\Bar(); 成功
这也有效(use
并且new
在同一行):
php -d auto_prepend_file=prepend.php -a 交互式外壳 php > 使用 foo\Bar; 新酒吧(); 成功
这失败了:
php -d auto_prepend_file=prepend.php -a 交互式外壳 php > 使用 foo\Bar; php > 新栏(); PHP 警告:未捕获的错误:在 php shell 代码中找不到类“Bar”:1
推荐阅读
- c# - 从用户控件读取数据的问题
- node.js - 帖子的 Nuxt 问题
- javascript - 在 Vue.js 中,如何检测 created() 挂钩中的代码是否在浏览器中运行?
- oracle - 使用 sid 到异构远程代理的 Oracle 丢失 rpc 连接
- c++ - C ++通过访问器函数返回私有二维数组
- jenkins - Jenkins 构建无法从 SVN 存储库签出代码
- java - 全局定义的布局元素
- javascript - Lit-Element:哪个事件用于 DOM 更新?
- ios - 无法在 Swift 中强制将类型“Void”转换为“String”
- apache-spark - 如何在流式查询中覆盖水印时间戳?