Я ищу регулярное выражение, которое будет точно идентифицировать любой проход времени вызова PHP по ссылкам в исходном коде, чтобы помочь перейти на PHP 5.3.
В настоящее время у меня есть [^=&]\s*&\s*\$
, но это не отфильтровывает случаи присваивания ( $var = &$othervar;
).
Это регулярное выражение должно быть совместимо с eclipse (извините, не уверен, какой вкус анализа регулярного выражения затмения).
Изменить: этот немного ближе (хотя и немного взломан): (?<!([&=]\s{0,15}))&\s*\$
Вы можете использовать phpcs для этого. У этого есть правило, чтобы определить время вызова по ссылкам :
Обеспечивает, чтобы переменные не передавались по ссылке при вызове функции.
Существует также плагин для интеграции phpcs в Eclipse
Генерирование наборов правил для PHPCS (и PMD) легко с помощью этого онлайн-генератора:
php -l
(php-linter) обнаруживает ошибки обратного вызова во время вызова, я использовал
find -name '*.php' -exec php -l '{}' \; >/dev/null
в linux
Вы не можете получить тех, у кого есть регулярное выражение. Вместо этого используйте 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 . С собственным выходом это будет немного сложнее;)
^(?!^.*(function|foreach|array)).*\(.*\&\$.*\)
Это должно помочь.
Вы можете использовать этот шаблон:
/(->|::|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
нет необходимости проверять, содержит ли массив параметров ссылки. Передача ссылок в массиве не считается временем вызова по ссылке и полностью прекрасным.