Получение списка всех функций и классов доступных в PHP

Для получения массива всех функций которые доступны для использования в PHP(с учётом подключённых модулей, а не в целом список всех возможных функций) можно воспользоваться функцией get_defined_functions(); она вернёт 2 массива, а именно с ключами internal и user, первый из которых будет содержать имена стандартных функций PHP, второй имена функций объявленных пользователями.

Для того чтобы получить список классов которые доступны в PHP(аналогично как и в случаи для функций будет возвращён массив содержащий имена классов, которые доступны в той версии PHP из которой производится вызов, с учётом подключённых расширений PHP) можно воспользоваться функций get_declared_classes(); В результате будет возвращён массив содержащий имена классов, то-есть в отличии от рассмотренной выше функции для получения имён функций массив с классами не будет содержать отдельного подмассива с именами классов указанных пользователем, то-есть будет возвращён именно единый массив в классами. Если класс объявлен для какого либо пространства имён, то в значении элемента указанного массива будет содержаться имя класса с указанием перед ним пространства имён, например "FTP\Connection".

Так же размещу по крайней мере пока информацию про функции token_get_all() и token_name() здесь

В процессе изучения вопроса получения списка функций и классов в PHP нашёл код, в котором в частности использовалось 2 функции, а именно token_get_all и token_name которые предположительно могут быть использованы при парсинге кода на языке PHP. В листинге ниже приведён пример кода, в котором функции token_get_all передаётся переменная содержащая код на языке PHP(переменной можно было так же присвоить код какого либо PHP-файла используя для этого функцию file_get_contents).

В приведённом выше листинге вызов var_dump($tokens); возвращает результат приведённый ниже.

Так же в приведённом выше листинге с PHP-кодом выполнение цикла foreach следующего за вызовом var_dump($tokens); возвращает результат приведённый ниже. В этом результате в 3-ей строке видно, что перенос строки который следует вместе с пробелом который следует перед ним(переносом строки) и после его(переноса строки) считается как единый пробел. Так же в 6-ой строке видно что для функции fopen вызов функции token_name возвращает значение T_STRING, для echo вызов token_name возвращает значение T_ECHO, что видно в второй строке приведённого результата возвращённого циклом foreach, таким образом для того чтобы в частности понять могут ли функции token_get_all и token_name быть полезны для парсинга PHP кода, возможно имеет смысл детальнее изучить работу указанных функций.

Выше было продемонстрировано, что элементами массива возвращаемого функцией token_get_all могут быть строки(например которая содержит значение точки с запятой, так же пока что не выяснено, может ли быть какое то ещё строковое значение или точка с запятой это единственное) или массив, который содержит в себе 3 элемента, первый из которых(с индексом 0) видимо идентификатор который может быть передан функции token_name, второе значение содержит строку рассматриваемой конструкции в строке, и третье значение(с индексом 2) - номер строки в которой находится рассматриваемая конструкция в переданной функции token_get_all строковой переменной. Касаемо идентификаторов передаваемых функции token_name было решено выяснить какими они могут быть и какое значение для них возвращает функция token_name, для этого был написан PHP-скрипт примерно такой же как в листинге ниже(от исходного он отличается диапазоном цикла).

В результате передачи различных параметров функции token_name с использованием скрипта описанного выше, выяснилось что если передавать функции значения параметров от 0 до 259(включительно) и предположительно значений больших или равных 406, то функция token_name возвращает строку "UNKNOWN"(без кавычек), в остальных случаях функция tokn_name возвращает значения приведённые в таблице ниже(эта таблица получена в результате выполнения скрипта приведённого в листинге выше).

Значение передаваемого параметраРезультат возвращённый функцией token_name()
240UNKNOWN
241UNKNOWN
242UNKNOWN
243UNKNOWN
244UNKNOWN
245UNKNOWN
246UNKNOWN
247UNKNOWN
248UNKNOWN
249UNKNOWN
250UNKNOWN
251UNKNOWN
252UNKNOWN
253UNKNOWN
254UNKNOWN
255UNKNOWN
256UNKNOWN
257UNKNOWN
258UNKNOWN
259UNKNOWN
260T_LNUMBER
261T_DNUMBER
262T_STRING
263T_NAME_FULLY_QUALIFIED
264T_NAME_RELATIVE
265T_NAME_QUALIFIED
266T_VARIABLE
267T_INLINE_HTML
268T_ENCAPSED_AND_WHITESPACE
269T_CONSTANT_ENCAPSED_STRING
270T_STRING_VARNAME
271T_NUM_STRING
272T_INCLUDE
273T_INCLUDE_ONCE
274T_EVAL
275T_REQUIRE
276T_REQUIRE_ONCE
277T_LOGICAL_OR
278T_LOGICAL_XOR
279T_LOGICAL_AND
280T_PRINT
281T_YIELD
282T_YIELD_FROM
283T_INSTANCEOF
284T_NEW
285T_CLONE
286T_EXIT
287T_IF
288T_ELSEIF
289T_ELSE
290T_ENDIF
291T_ECHO
292T_DO
293T_WHILE
294T_ENDWHILE
295T_FOR
296T_ENDFOR
297T_FOREACH
298T_ENDFOREACH
299T_DECLARE
300T_ENDDECLARE
301T_AS
302T_SWITCH
303T_ENDSWITCH
304T_CASE
305T_DEFAULT
306T_MATCH
307T_BREAK
308T_CONTINUE
309T_GOTO
310T_FUNCTION
311T_FN
312T_CONST
313T_RETURN
314T_TRY
315T_CATCH
316T_FINALLY
317T_THROW
318T_USE
319T_INSTEADOF
320T_GLOBAL
321T_STATIC
322T_ABSTRACT
323T_FINAL
324T_PRIVATE
325T_PROTECTED
326T_PUBLIC
327T_READONLY
328T_VAR
329T_UNSET
330T_ISSET
331T_EMPTY
332T_HALT_COMPILER
333T_CLASS
334T_TRAIT
335T_INTERFACE
336T_ENUM
337T_EXTENDS
338T_IMPLEMENTS
339T_NAMESPACE
340T_LIST
341T_ARRAY
342T_CALLABLE
343T_LINE
344T_FILE
345T_DIR
346T_CLASS_C
347T_TRAIT_C
348T_METHOD_C
349T_FUNC_C
350T_NS_C
351T_ATTRIBUTE
352T_PLUS_EQUAL
353T_MINUS_EQUAL
354T_MUL_EQUAL
355T_DIV_EQUAL
356T_CONCAT_EQUAL
357T_MOD_EQUAL
358T_AND_EQUAL
359T_OR_EQUAL
360T_XOR_EQUAL
361T_SL_EQUAL
362T_SR_EQUAL
363T_COALESCE_EQUAL
364T_BOOLEAN_OR
365T_BOOLEAN_AND
366T_IS_EQUAL
367T_IS_NOT_EQUAL
368T_IS_IDENTICAL
369T_IS_NOT_IDENTICAL
370T_IS_SMALLER_OR_EQUAL
371T_IS_GREATER_OR_EQUAL
372T_SPACESHIP
373T_SL
374T_SR
375T_INC
376T_DEC
377T_INT_CAST
378T_DOUBLE_CAST
379T_STRING_CAST
380T_ARRAY_CAST
381T_OBJECT_CAST
382T_BOOL_CAST
383T_UNSET_CAST
384T_OBJECT_OPERATOR
385T_NULLSAFE_OBJECT_OPERATOR
386T_DOUBLE_ARROW
387T_COMMENT
388T_DOC_COMMENT
389T_OPEN_TAG
390T_OPEN_TAG_WITH_ECHO
391T_CLOSE_TAG
392T_WHITESPACE
393T_START_HEREDOC
394T_END_HEREDOC
395T_DOLLAR_OPEN_CURLY_BRACES
396T_CURLY_OPEN
397T_DOUBLE_COLON
398T_NS_SEPARATOR
399T_ELLIPSIS
400T_COALESCE
401T_POW
402T_POW_EQUAL
403T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG
404T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG
405T_BAD_CHARACTER
406UNKNOWN
407UNKNOWN
408UNKNOWN
409UNKNOWN
410UNKNOWN

Комментарии

Если у Вас возникли вопросы, Вы можете задать их в форме ниже. В частности если Ваш вопрос по Bitrix и что то не получается - можно спросить. Ваш e-mail не публикуется, при этом я отвечу на него если будет что то по теме. Писать необходимо для людей - избегайте сленга, пишите орфографически правильно.

Имя:
E-mail:
Текст комментария:

Вы так же можете прочитать следующие статьи: