При использовании token_get_all (), как мне определить, является ли "одинокий" T_STRING вызовом функции, константой или чем-то еще? - PullRequest
1 голос
/ 10 марта 2020

Минимальный пример кода:

<?php

    $avarname = 'a var value';

    function a_function_name($a_parameter = true)
    {
        // a comment
    }

    a_function_name();

Структура с использованием token_get_all ():

T_OPEN_TAG: <?php
T_WHITESPACE:
T_VARIABLE: $avarname
T_WHITESPACE:
T_WHITESPACE:
T_CONSTANT_ENCAPSED_STRING: 'a var value'
T_WHITESPACE:
T_FUNCTION: function
T_WHITESPACE:
T_STRING: a_function_name
T_VARIABLE: $a_parameter
T_WHITESPACE:
T_WHITESPACE:
T_STRING: true
T_WHITESPACE:
T_WHITESPACE:
T_COMMENT: // a comment
T_WHITESPACE:
T_WHITESPACE:
T_STRING: a_function_name
T_WHITESPACE:

Как видите, можно определить функцию определение , проверив T_STRING , которому предшествует T_WHITESPACE , которому предшествует T_FUNCTION . Пока все хорошо.

Однако , функция , вызов - это всего лишь T_STRING , как и многие другие вещи, такие как «истинная» константа для параметра, без специального символа ни до, ни после него.

Как я узнаю, что T_STRING относится к имени функции или к чему-то еще, когда перед ним нет символа, сообщающего моему интерпретатору, на что должен ссылаться следующий T_STRING ?

Если ваш ответ будет таким, что мне нужно проверить, существует ли функция с именем значения T_STRING, означает ли это, что не может быть функции с именем true ()? Так как это будет противоречить «истинной» константе? Если мне нужно сделать такую ​​проверку, это усложняет ситуацию по-разному ...

1 Ответ

2 голосов
/ 10 марта 2020

Что token_get_all на самом деле возвращает это (с уже обработанными именами токенов):

  ...,
  [26]=>
  array(3) {
    [0]=>
    string(8) "T_STRING"
    [1]=>
    string(15) "a_function_name"
    [2]=>
    int(10)
  }
  [27]=>
  string(1) "("
  [28]=>
  string(1) ")"

token_get_all только токенизация , он не разбирает части на логический AST. Следующим шагом после этого будет рассмотрение того, как токены совмещаются и какие логические единицы они образуют. Здесь вы должны разобрать три последовательных токена "a_function_name", "(" и ")" в значение вызов функции .

Возможно, вы захотите использовать существующий PHP Parser , вместо того, чтобы заново изобретать этот шаг с нуля.

...