PHP语法使用lint检查以及如何在String而不是File上执行此操作

Sol*_*son 8 php command-line syntax-error

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

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

php -l somefile.php
Run Code Online (Sandbox Code Playgroud)

但我想检查字符串,而不是文件!如何才能做到这一点?可以使用STDIN,STDOUTSTDERR来帮忙吗?

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

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

我对这个PHP命令行的工作方式完全不了解......有人可以帮忙解释一下吗?

hak*_*kre 14

您可以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 -
Run Code Online (Sandbox Code Playgroud)

;单引号字符串后面缺少结尾分号.如果你添加它,错误消失,PHP告诉你:

$ echo "<?php echo 'hello world';" | php -l
No syntax errors detected in -
Run Code Online (Sandbox Code Playgroud)

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

另一种方法是编写您想要自己的代码(或复制并粘贴它).这通过使用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 -
Run Code Online (Sandbox Code Playgroud)

BTW,-r通常用于提供执行代码的开关在这种情况下不起作用,并且它给出了错误:

$ php -l -r "echo 1"
Either execute direct code, process stdin or use a file.
Run Code Online (Sandbox Code Playgroud)

最有可能的原因是它用于运行代码,而不是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);
Run Code Online (Sandbox Code Playgroud)

输出如下:

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 -
)
Run Code Online (Sandbox Code Playgroud)


g13*_*13n 5

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

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

HTH。