8

首先,我对如何在命令行中运行 PHP 感到困惑。我一直在网上阅读几篇文章,他们都说您需要一个 CLI(命令行界面)。

基本上,我有 PHP 文件,我想这样调用:

php -l somefile.php

但我想检查一个字符串,而不是一个文件!如何才能做到这一点?使用STDINSTDOUTSTDERR可以帮助解决这个问题吗?

如果是这样,怎么做?有人可以在这里提供一个例子吗?

另外,我在哪里放置上面的代码?我无法访问命令行(我不认为),或者我只是将它放在将运行的 PHP 文件本身中?在这种情况下,它会在命令行中执行此代码吗?

我完全不知道这个 PHP 命令行是如何工作的……有人可以帮我解释一下吗?

4

3 回答 3

15

您可以php -l通过管道检查来自 STDIN 的代码。示例:

$ echo "<?php echo 'hello world'" | php -l

Parse error: syntax error, unexpected end of file, expecting ',' or ';' in - on line 2

Errors parsing -

;这里在单引号字符串之后缺少结束分号。如果你添加它,错误就会消失,PHP 会告诉你:

$ echo "<?php echo 'hello world';" | php -l
No syntax errors detected in -

-中 的破折号Errors parsing -No syntax errors detected in -代表 STDIN。它通常用于此目的。

另一种方法是编写您自己想要 lint 的代码(或复制并粘贴它)。这通过使用 lint 开关来工作--,输入代码并通过在自己的一行上输入Ctrl + D(Linux) / Ctrl + Z(Win) 来完成它:

$ php -l --
<?php echo "1"
^Z

Parse error: syntax error, unexpected end of file, expecting ',' or ';' in - on line 2

Errors parsing -

顺便说一句,-r通常用于提供执行代码的开关在这种情况下不起作用并给出错误:

$ php -l -r "echo 1"
Either execute direct code, process stdin or use a file.

很可能是因为它用于运行代码,仅此而已,没有 linting。它也没有打开 PHP 标记。


从所有这些选项中,如果您想通过管道输入第一个选项可能最有意义(如果proc_open您需要更多控制,您也可以使用它进行操作)。这是一个使用 PHP 的简单示例exec

<?php
/**
 * PHP Syntax Checking with lint and how to do this on a string, NOT a FILE
 *
 * @link http://stackoverflow.com/q/12152765/367456
 * @author hakre
 */

$code = "<?php echo 'hello world'";

$result = exec(sprintf('echo %s | php -l', escapeshellarg($code)), $output, $exit);

printf("Parsing the code resulted in; %s\n", $result);

echo "The whole output is:\n";

print_r($output);

输出如下:

Parsing the code resulted in; Errors parsing -
The whole output is:
Array
(
    [0] => 
    [1] => Parse error: syntax error, unexpected '"', expecting ',' or ';' in - on line 1
    [2] => Errors parsing -
)
于 2013-08-14T22:07:45.440 回答
5

如果你想要 lint 代码(不在文件中),唯一的选择是编写一个包装器。

假设你的 $HOME/bin 在 /usr/bin 之前,你可以在 $HOME/bin/php 中安装你的包装器,它有一个不同的命令行 linting 选项。包装器将创建一个临时文件,将代码放在那里,运行/usr/bin/php -l file然后删除临时文件。

HTH。

于 2012-08-28T04:32:06.887 回答
2

我建议检查一下phpstan。它是一个用 PHP 构建的 linter,工作起来很像 phpunit,但用于 linting 代码。您可以编写配置、控制 linting 级别以及包含/忽略文件夹。

它也有正确的退出代码。

https://github.com/phpstan/phpstan

如果无法使用,我在这里使用了这个脚本,它运行良好。

于 2017-02-02T21:52:20.953 回答