Проверка синтаксиса PHP с помощью lint и как это сделать в строке, а не в файле

во-первых, я запутался в том, как запустить PHP в командной строке. Я читал несколько статей в интернете, и все они говорят, что вам нужен CLI (интерфейс командной строки).

в принципе, у меня есть файлы PHP, и я хочу вызвать что-то вроде этого:

php -l somefile.php

но я хочу проверить строка, а не файл! Как это сделать? Может с помощью STDIN, STDOUT или STDERR помочь с этим вообще?

если да, то как? Может ли кто-нибудь привести пример здесь?

кроме того, где я могу разместить это выше кода? У меня нет доступа к командной строке (я не думаю), или я просто помещаю ее в сам файл PHP, который будет работать? Будет ли он выполнять этот код в этом случае в командной строке?

Я совершенно не знаю, как работает эта командная строка PHP... Кто-нибудь может помочь пролить свет на это?

3 ответов


Если вы хотите код lint (не в файле), единственный вариант-написать оболочку.

предполагая, что ваш $HOME / bin предшествует /usr/bin, вы можете установить свою оболочку в $HOME/bin / php, которая имеет другую опцию для компоновки командной строки. Обертка создаст временный файл, поместит туда код, запустите /usr/bin/php -l file а затем удалите временный файл.

HTH.


вы можете проверить код 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. Он обычно используется для этого.

другой способ-написать код, который вы хотите создать самостоятельно (или скопировать и вставить его). Это работает с помощью ворсинок переключитесь с --, вводя код и заканчивая его вводом 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.

скорее всего потому, что он предназначен для выполнения кода, и это его, без пылеобразования. Также это без открытия 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 -
)

Я бы предложил проверить phpstan. Это Линтер, построенный на PHP, и работает очень похоже на phpunit, но для кода линтинга. Вы можете писать конфигурации, управлять уровнями компоновки и включать/игнорировать папки.

Он также имеет правильные коды выхода.

https://github.com/phpstan/phpstan

Если это невозможно, я использовал этот скрипт здесь и он отлично работает.