pmeth / php_repl
PHP 的命令行 REPL (Read-Evaluate-Print-Loop),用 PHP 编写。
Requires
- php: >=5.3.0
This package is not auto-updated.
Last update: 2024-09-23 14:44:12 UTC
README
PHPRepl 是一个 PHP 的 read-eval-print loop,用 PHP 编写。它的目标是轻量、简洁、现代、面向对象,并在可能的情况下利用 PHP 的现有功能。
安装
该库可以通过 Composer 获取,因此获取它很容易。只需将此添加到您的 composer.json
文件中
"require": {
"pmeth/php_repl": "dev-master"
}
然后运行 composer install
使用方法
当您启动 PHPRepl 时,您将看到一个提示符
php>
您在此处输入的任何 PHP 代码都将被评估并打印其结果。您不需要包含尾随的分号。
php> 5+5
int(10)
php>
您评估的最后一个表达式的返回值存储在 $_
中。
php> $_
int(10)
php>
显示类型取决于返回类型。数字类型和布尔值使用 var_dump()
显示。字符串和数组使用 var_export()
打印,其他任何内容都使用 print_r()
。
php> "123"
'123'
php> "don't"
'don\'t'
php> 5.5
float(5.5)
php> false
bool(false)
php> null
NULL
php>
未捕获的异常将被捕获并打印出来
php> throw new Exception("Test 123", 123)
exception 'Exception' with message 'Test 123' in /Users/ieure/Projects/php_repl/PHP/Repl.php(143) : eval()'d code:1
Stack trace:
#0 /Users/ieure/Projects/php_repl/PHP/Repl.php(143): eval()
#1 /Users/ieure/Projects/php_repl/PHP/Repl.php(62): PHPRepl->run()
#2 /Users/ieure/Projects/php_repl/testrepl(20): PHPRepl->__construct(Array)
#3 {main}
php>
如果捕获到异常,它将存储在 $_
中,因为执行代码不会有有意义的返回值。
如果输入行的最后一个字符是反斜杠,REPL 将积累行,直到找到不以反斜杠结尾的行;然后这些行将被评估。当 REPL 在积累行时,提示符将更改为 >
。
php> $foo = array('one', \
> 'two', \
> 'three')
array (
0 => 'one',
1 => 'two',
2 => 'three',
)
php>
在代码评估之前,会改变输入的某些方面。例如,大多数表达式前会添加 return
,如果省略了分号,则添加分号等。有关详细信息,请参阅下面的 扩展。
当您完成 REPL 时,可以发送 ^D
、die
或 exit
以退出。
糖
有一些功能可以使您的操作更轻松。糖命令在 REPL 代码中运行一个方法,以帮助您检查您的代码。它们是两个字符,第一个字符总是逗号,后面跟着要检查的内容。
文档
可以通过 ,d
访问文档块
php> ,d PHPRepl
/**
* PHPRepl
*
* @package PHPRepl
* @author Ian Eure <ieure@php.net>
* @version @package_version@
*/
'---'
php> ,d PHPRepl::read
/**
* Read input
*
* @param
*
* @return string Input
*/
'---'
php>
反射
REPL 知道如何反射类、对象和方法。
php> ,, sort
Function [ <internal:standard> function sort ] {
- Parameters [2] {
Parameter #0 [ <required> &$arg ]
Parameter #1 [ <optional> $sort_flags ]
}
}
'---'
扩展
如上所述,输入在评估之前会有所改变。由于这可能会产生意外的效果,您可以使用 ,e
快捷方式或运行 $this->cleanup()
来检查扩展的代码。
php> 5+5
int(10)
php> ,e
'return 5+5;'
php> $this->cleanup('5+5')
'return 5+5;'
php> ,e 5+5
'return 5+5;'
重用
您可以在自己的项目中重用 PHPRepl。
require_once 'PHPRepl.php';
function do_stuff()
{
if ($debug_condition) {
$repl = new PHPRepl();
$repl->run();
}
}
REPL 将访问您的函数作用域内的任何内容。如果您从对象方法中调用它,请注意 $this
总是 PHPRepl 实例,而不是您的对象。
传递作用域
如果您想将额外的变量传递到 REPL 的作用域中,您可以将它们包含在传递给 run() 的数组中。
require_once 'PHPRepl.php';
class StuffDoer {
function do_stuff()
{
if ($debug_condition) {
$repl = new PHPRepl();
$repl->run(array('_caller' => $this));
}
}
}
配置
PHPRepl 将其配置存储在 $HOME/.phpreplrc
中。如果没有文件,将为您创建一个默认文件。当您退出 REPL 时,您在运行 REPL 时设置的任何选项都将被写入。
以下选项被识别:
prompt
。REPL 显示的提示符。readline
。是否使用 readline。readline_hist
。readline 命令历史文件的路由。
危险
- 评估的代码在 PHPRepl 的相同进程中运行,因此如果您评估了会导致致命错误的内容,PHPRepl 将终止。抱歉。
- 输出缓冲用于捕获由 eval’d 代码打印的任何内容。如果您有代码在长时间内产生输出,您可能不会立即看到结果。使用
flush()
。 - PHPRepl 强制执行某些设置。您不能更改以下值
display_errors
。始终开启。html_errors
。始终关闭。error_reporting
。始终为E_ALL | E_STRICT
。- 输出缓冲。在评估代码周围始终启用。
ob_implicit_flush
。始终开启。- 输出缓冲的回调方法。
替代方案
我考虑了几个旨在提供类似功能的不同项目,但出于各种原因拒绝了它们。
-
php -a
。内置,无法使用。它将代码通过PHP过滤,就像它们是普通文件一样,因此如果您想实际执行任何代码,则需要将其包裹在<?php ?>
标签中。没有提示、行编辑或历史记录。 -
phpsh。由Facebook开发,自2006年以来未维护。它使用Python围绕PHP包装,并且与OS X附带的自带Python不兼容。
-
PHP_Shell。在PEAR中,自2006年以来未维护。实际上非常大。在评估之前使用Token API解析字符串。为REPL创建自己的命令语言,而不是利用它是运行环境的机制。
-
phpa。与我想要的最接近,但还不够。它也很过时,并且是过程式PHP 4代码。需要 readline,这对于终端来说很好,但在Emacs中运行时无济于事。
-
PHP Interactive。一个Web应用程序,而不是可以从命令行使用的应用程序。