php,带有为windows编译的readline支持



是否有内置readline支持的编译php包?

在交互模式下使用php需要readline。

我研究了如何为windows编译php,但它们需要MS Visual Studio,而我没有。

Readline扩展在Windows上不可用。我认为可以在cygwin下编译PHP,启用--with-readline选项

    //The readline library is not available on Windows.
<?php
       if (PHP_OS == 'WINNT') {
           echo '$ ';
           $line = stream_get_line(STDIN, 1024, PHP_EOL);
        } else {
                 $line = readline('$ ');
               }
 ?>

我直接从php文档中找到了这段代码。正如你可能看到的,在windows机器中(至少在ddefault数据包中)不支持readline库,这很糟糕,但你可以通过执行上面代码中的"$line=blah,blah"来获得类似的东西。

我尝试了一下,并使用windows的标准cmd使其工作(尽管我认为交互式php模式无论如何都不会在windows中工作),但这总比没有任何用户输入要好(如果你真的记住了所有代码的话)。

这可能有点晚了,但下面是解决我这个问题的解决方案:按照C#的Console的风格,我写了一个小类,可以做readLine()writeLine($str):

class Console {
    const READLINE_MAX_LENGTH = 0xFFFF;
    const WRITELINE_NEWLINE = "n";
    private static /*Resource*/ $stdin;
    private static /*Resource*/ $stdout;
    public static function /*void*/ close () {
        fclose(self::$stdin);
        fclose(self::$stdout);
    }
    public static function /*void*/ open () {
        self::$stdin = fopen('php://stdin', 'r');
        self::$stdout = fopen('php://stdout', 'w');
    }
    public static function /*string*/ readLine () {
        return stream_get_line(self::$stdin, self::READLINE_MAX_LENGTH, "rn");
    }
    public static function /*void*/ writeLine (/*string*/ $str) {
        fwrite(self::$stdout, $str);
        fwrite(self::$stdout, self::WRITELINE_NEWLINE);
    }
}

示例用法:

Console::open();
echo "Input something: ";
$str = Console::readLine();
if (is_string($str))
    Console::writeLine($str);
else
    echo "ERROR";
Console::close();

EDIT:这个方法显然只有在父进程不更改STDOUT或STDIN的情况下才有效。

考虑到galymzhan的答案,在Windows上以交互模式运行PHP的另一个选项是使用其中一个PHP REPL。你不会得到选项卡的完成,因为这依赖于readline。

到目前为止,对我有效的REPL是PHP Shell

http://jan.kneschke.de/projects/php-shell/

最新更新