带有适当的PHP 5.3支持的REPL/交互式shell?

10

我已经使用phpsh有一段时间了,过去它表现得非常好。但是其命名空间支持仍然不太好,这可能会很令人沮丧。

\Somespace\Someclass::someStaticFunction()这样的东西如果不禁用检查方法是否存在,就不能正常工作,这会导致频繁的致命错误和重置环境。

有多个PHP REPL可供选择,包括内置的PHP shell(php -a),但很难使用。

是否有人知道替代方案或具有正确命名空间支持的phpsh fork?还是我忽略了一些简单的配置修复方法...


一个例子:

这个测试文件:

<?
namespace testing;

function echoSome(){
        echo 'Something';
}

\testing\echoSome();

在 phpsh 中产生了预期的输出(如预期所示)

php> include '/path/test.php';
Something
php>

但是尝试再次调用相同的函数不起作用:

php> \testing\echoSome();
Not executing input: Possible call to undefined function echoSome()
See /etc/phpsh/config.sample to disable UndefinedFunctionCheck.

没有命名空间时,该函数仍然可用:

<?
function echoSome(){
        echo 'Something';
}

echoSome();

在phpsh中:

php> include '/path/test.php';
Something

而且调用仍然有效:

php> echoSome();
Something

你能稍微详细描述一下,你认为phpsh命名空间支持哪些方面存在不足吗? - Doa
我会添加一些我觉得困惑的片段,但也许@michiel也可以澄清一些? - Nanne
是的,这是我所说的一个完美的例子。除了\someNameSpace\someFunction();之外,someNamespace\SomeClass::someFunction()也不起作用。我记得匿名函数(另一个5.3的特性)也有问题,但是我的大脑因为缺乏咖啡因而无法记住。 - Marlies
现在有PsySH和Boris。我不知道它们是否符合您的要求,但在本评论发布时,它们都在github上有最新的版本发布。 - still_dreaming_1
2个回答

3
我发现使用eval作为一个很好的解决方法:
php> = eval('return \testing\echoSome();')

是的,这是一个hack,但是很实用。 :)

2
有几个备选方案。
首先,您可能想尝试 PHP 5.4 的 CLI。据说,交互式控制台已经在 5.4 中得到了极大的改进。他们可能同意您的看法,即内置 shell 难以使用 :) 我所知道的是它已经被“翻新”了。
有一些替代方案,例如 phpa,看起来相当过时,以及运行最新的 phpsh Git 版本。从他们的“问题”页面可以看出,他们知道命名空间问题,因此可能会尝试改进。由于它是开源的,您可以让别人为您修复它,或者自己修复它 ;-)
总的来说,我认为您面临着选择普通的 PHP CLI 或 phpsh 之间的选择。没有成熟到能够做到两者所能做的事情的替代品,大多数替代品甚至更过时(即有 php_repl,已更新了 3 年,而不是 phpsh 的 2 年)。
祝你好运。

但是寻找一个交互式的5.3版本的shell,不会以5.4版本的控制台结束,我猜?最新的git版本相当古老,我不确定那会有什么成就? - Nanne
我没有注意到git版本已经过时了,对此感到抱歉。除了正常的php-cli之外,仍然比任何其他替代品更新。我担心你最终会使用5.4版本的控制台,除非有一些我不知道的phpsh秘密分支。 - Doa
2
没错,结果我没有正确地测试git版本。看起来,它完全支持"\namespace\foo::bar()",只是不接受PHP本身接受的"namespace\foo::bar()"。这只是一个小问题,所以我似乎太快地忽略了git版本。我将其标记为答案 :) - Marlies
然后我会授予赏金 :) - Nanne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接