使用 lint 进行 PHP 语法检查以及如何在字符串而不是文件上执行此操作

标签 php command-line syntax-error

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

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

php -l somefile.php

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

如果可以,怎么做?有人可以在这里举个例子吗?

另外,我应该把上面的代码放在哪里?我无权访问命令行(我不认为),或者我只是将它放在将运行的 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/

相关文章:

caching - 在 nuget 命令工具中使用 -verbosity 和 -version 抑制详细输出

java.lang.NoSuchMethodError : Graph: method <init>()V not found

java - 这些Java错误是什么意思?

iteration - 如何解决Ocaml循环中的语法错误?

Python 3.2.2 打印函数语法错误在 Mac 但不是在 Windows

javascript - 接收错误代码3、http_status null、body null、异常状态2

php - 自定义管理部分的 Drupal 最佳实践

Linux - 安全地杀死 apache 拥有的一些进程

php - 将用户输入的日期与数据库中存储的日期字段进行比较

PHP - 使用 PDO 从列索引中获取字段名称