将类自动加载到PHP交互式Shell中

将类自动加载到PHP交互式Shell中,php,proc-open,Php,Proc Open,我试图从php脚本运行php交互式shell。更具体地说,我希望能够从交互式shell调用我的类。 我设法找到了这个 #自定义_交互_shell.php 函数proc($command,&$return\u var=null,array&$stderr\u output=null) { $return\u var=null; $stderr_输出=[]; $descriptorspec=[ //必须使用php://stdin(输出)以允许显示命令输出 //以及用户与流程的交互。 0=>['fil

我试图从php脚本运行php
交互式shell
。更具体地说,我希望能够从交互式shell调用我的类。 我设法找到了这个

#自定义_交互_shell.php
函数proc($command,&$return\u var=null,array&$stderr\u output=null)
{
$return\u var=null;
$stderr_输出=[];
$descriptorspec=[
//必须使用php://stdin(输出)以允许显示命令输出
//以及用户与流程的交互。
0=>['file','php://stdin“,”r'],
1=>['file','php://stdout“,”w'],
2=>['pipe','w'],
];
$pipes=[];
$process=@proc_open($command、$descriptorspec、$pipes);
如果(是_资源($process)){
//循环进程,直到它正常退出。
做{
$status=proc\u get\u status($process);
//如果我们的stderr管道有数据,请抓取它以供以后使用。
如果(!feof($pipes[2])){
//我们的行为就像passthru一样,并在错误出现时显示错误。
$error_line=fgets($pipes[2]);
echo$error\u行;
$stderr_输出[]=$error_行;
}
}而($status['running']);
//根据文档,退出代码仅在第一次调用时有效
//流程完成后,我们不能依赖
//proc_关闭,因为proc_get_状态将首先读取退出代码。
$return_var=$status['exitcode'];
过程结束($过程);
}
}
proc('php-a-d auto_prepend_file=./vendor/autoload.php');
但它只是不工作,它试图进行交互,但冻结了很多,即使在滞后之后,它也不能真正正确地执行命令

例如:

>php自定义\u交互\u shell.php
交互式shell
php>echo-1;
警告:在第1行的PHP shell代码中使用未定义的常量eo-假定为“eo”(这将在PHP的未来版本中引发错误)

如果希望能够从交互式shell运行PHP类,则可以使用终端附带的默认类。从终端输入: php-a

然后,在下面的示例中,我创建了一个名为Agency.php的文件,其中包含类Agency。我可以要求_once()将其放入活动shell中,然后调用该类及其方法:

Interactive shell

php > require_once('Agency.php');
php > $a = new Agency();
php > $a->setname("some random name");
php > echo $a->getname();
some random name
您还可以在交互式shell中使用以下命令自动加载当前目录中的文件/类:

spl_autoload_register(function ($class_name) {
    include $class_name . '.php';
});