Regexp для определения времени прохождения вызова по ссылкам в исходном коде PHP - PullRequest
7 голосов
/ 27 октября 2010

Я ищу регулярное выражение, которое точно идентифицирует любую передачу времени вызова PHP по ссылкам в исходном коде, чтобы облегчить переход на PHP 5.3.

В настоящее время у меня есть [^=&]\s*&\s*\$, но это не отфильтровывает случаи назначения ($var = &$othervar;).

Это регулярное выражение должно быть совместимо с eclipse (извините, не знаю, какой вариант синтаксического анализа regexp eclipse).

Редактировать: Этот немного ближе (хотя немного хак): (?<!([&=]\s{0,15}))&\s*\$

Ответы [ 5 ]

7 голосов
/ 27 октября 2010

Для этого вы можете использовать phpcs . У него есть правило для определения времени прохождения вызова по ссылкам :

Гарантирует, что переменные не передаются по ссылке при вызове функции.

Существует также плагин для интеграции phpcs в Eclipse

Создать набор правил для PHPCS (и PMD) легко с помощью этого онлайн-генератора:

4 голосов
/ 05 мая 2014

php -l (php-linter) находит ошибки передачи по ссылке во время вызова, я использовал

find -name '*.php' -exec php -l '{}' \; >/dev/null

в Linux

3 голосов
/ 27 октября 2010

Вы не можете получить те с регулярным выражением. Используйте взамен Tokenizer . Вам нужно будет найти '&', где следующему '(' влево (разрешите скобки при ходьбе) предшествует T_STRING, но не T_FUNCTION.

$tokens = new TokenStream($source);
foreach ($tokens as $i => $token) {
    if ($token->is(T_AMP)) {
        while ($i--) {
            if ($tokens[$i]->is(T_CLOSE_ROUND, T_CLOSE_SQUARE, T_CLOSE_CURLY)) {
                $i = $tokens->complementaryBracket($i);
            } elseif ($tokens[$i]->is(T_OPEN_ROUND)) {
                if ((($tokens[--$i]->is(T_WHITESPACE) && $tokens[--$i]->is(T_STRING))
                     || $tokens[$i]->is(T_STRING))
                    && !$tokens[--$i]->is(T_WHITESPACE)
                    && !$tokens[--$i]->is(T_FUNCTION)
                ) {
                    throw new Exception('Call-time pass by reference');
                }
                break;
            }
        }
    }
}

Используется моя оболочка TokenStream . С нативным выводом это будет немного сложнее;)

0 голосов
/ 04 ноября 2015

Вы можете использовать этот шаблон:

/(->|::|call_user_func|call_user_func_callable).*\(.*\&\$/

Будет соответствовать следующим строкам:

'->($arg1, &$arg2)'
'->(&$arg1, $arg2)'
'::($arg1, &$arg2)'
'::(&$arg1, $arg2)'
'call_user_func($callback, &$arg2)'
'$callback, &$arg2)'
'call_user_func_callable $callback, &$param_arr)'

В случае call_user_func_callable нет необходимости проверять, содержит ли массив параметров ссылки. Передача ссылок в массиве не считается передачей времени вызова по ссылке и вполне допустима.

0 голосов
/ 22 июля 2015
^(?!^.*(function|foreach|array)).*\(.*\&\$.*\)

Это должно помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...