首先,我对如何在命令行中运行 PHP 感到困惑。我在网上阅读了几篇文章,他们都说你需要一个 CLI(命令行界面)。
基本上,我有 PHP 文件,我想这样调用:
php -l somefile.php
但我想检查一个字符串,而不是一个文件!如何才能做到这一点?使用 STDIN、STDOUT 或 STDERR 可以帮助解决这个问题吗?
如果可以,怎么做?有人可以在这里举个例子吗?
另外,我应该把上面的代码放在哪里?我无权访问命令行(我不认为),或者我只是将它放在将运行的 PHP 文件本身中?在这种情况下,它会在命令行中执行这段代码吗?
我完全不知道这个 PHP 命令行是如何工作的...有人能帮我解释一下吗?
最佳答案
您可以使用 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 完成它(赢)在它自己的一行:
$ 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 -
)
关于使用 lint 进行 PHP 语法检查以及如何在字符串而不是文件上执行此操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12152765/