pmeth/php_repl

PHP 的命令行 REPL (Read-Evaluate-Print-Loop),用 PHP 编写。

dev-master 2014-02-14 14:04 UTC

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 时,可以发送 ^Ddieexit 以退出。

有一些功能可以使您的操作更轻松。糖命令在 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 命令历史文件的路由。

危险

  1. 评估的代码在 PHPRepl 的相同进程中运行,因此如果您评估了会导致致命错误的内容,PHPRepl 将终止。抱歉。
  2. 输出缓冲用于捕获由 eval’d 代码打印的任何内容。如果您有代码在长时间内产生输出,您可能不会立即看到结果。使用 flush()
  3. PHPRepl 强制执行某些设置。您不能更改以下值
    1. display_errors。始终开启。
    2. html_errors。始终关闭。
    3. error_reporting。始终为 E_ALL | E_STRICT
    4. 输出缓冲。在评估代码周围始终启用。
    5. ob_implicit_flush。始终开启。
    6. 输出缓冲的回调方法。

替代方案

我考虑了几个旨在提供类似功能的不同项目,但出于各种原因拒绝了它们。

  • 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应用程序,而不是可以从命令行使用的应用程序。