Вот такая вот интересная задача.
Есть файл написанный на PHP
Как получить список классов, функций и переменных объявленных в нем
1. eai - 20 Октября, 2010 - 11:50:53 - перейти к сообщению
2. Stas.progger - 20 Октября, 2010 - 12:11:40 - перейти к сообщению
Для работы с классами можно воспользоваться Reflection Api
3. eai - 20 Октября, 2010 - 12:33:25 - перейти к сообщению
Stas.progger пишет:
Для работы с классами можно воспользоваться Reflection Api
Тема интересная, не знал о её существовании, спасибо за наводку.
Однако это немного не то.
Это API позволяет узнать все про классы функции и.т.д, но не дает знаний о том, что есть конкретном файле.
4. JustUserR - 20 Октября, 2010 - 13:21:45 - перейти к сообщению
eai пишет:
Для проведения анализа PHP-скриптов в действительности наиболее оптимальным вариатом является использованите встроенных средств оригинального интерпретатора - дело в том что PHP является динамическим языком и для получения полной информации об некоторой PHP-программе собственными средствами необходимо провести ее исполненение по всем правилам языка - тем не менее благодаря использованию пакета runkit и его набора функций sandnox вы можете произвести такую интерпретацию в управляемом режиме с применением оригинального анализатора
Как получить список классов, функций и переменных объявленных в нем
5. eai - 20 Октября, 2010 - 13:31:56 - перейти к сообщению
JustUserR пишет:
eai пишет:
Для проведения анализа PHP-скриптов в действительности наиболее оптимальным вариатом является использованите встроенных средств оригинального интерпретатора - дело в том что PHP является динамическим языком и для получения полной информации об некоторой PHP-программе собственными средствами необходимо провести ее исполненение по всем правилам языка - тем не менее благодаря использованию пакета runkit и его набора функций sandnox вы можете произвести такую интерпретацию в управляемом режиме с применением оригинального анализатораКак получить список классов, функций и переменных объявленных в нем
Вау, тема прикольная, но надо изучать. Спасибо за наводку!
6. JustUserR - 20 Октября, 2010 - 13:43:14 - перейти к сообщению
eai пишет:
Пожалуйста! Приведенная схема с использовнием runkit-интерпретатором позволяющим программным образом проводить защищенное поэтапное исполнение сторонних PHP-скриптов - может применяться как для систем шаблонизации и модульных web-сайтов при которой ресурс проходит предварительную провевку и основная исполняемая программа защищается от полной передачи упрвления - так и для расшифроки кодированных PHP-скриптов в которых на некотором этапе выполнения производится генерация требуемого исходного кода
Вау, тема прикольная, но надо изучать. Спасибо за наводку!
7. eai - 20 Октября, 2010 - 13:44:10 - перейти к сообщению
Эх, беглый анализ позволил выяснить следующие
Смысл сводиться к возможности компиляции без выполнения или с выполнением но не в основном потоке и "курочиния" кода на лету. А вот что есть в файле ответа нет
(Добавление)
Хочется то в сущности получить следующую вещь
Файл xxx.php
Массив внешних подключаемых модулей (include)
Массив классов
Массив переменных
Массив функций
Массив констант
Конечно переменные в внутри функции и методы класса не нужны, их всегда можно получить зная имя класса.
А вот список имен классов, функций, это проблема если в файле есть include/require
(Добавление)
http://www[dot]tig12[dot]net/spip/Parsing-PHP-code[dot]html
Нарыл, чел решал подобную проблему и пришел к выводу что надоть использовать парсер а не машину PHP
Смысл сводиться к возможности компиляции без выполнения или с выполнением но не в основном потоке и "курочиния" кода на лету. А вот что есть в файле ответа нет
(Добавление)
Хочется то в сущности получить следующую вещь
Файл xxx.php
Массив внешних подключаемых модулей (include)
Массив классов
Массив переменных
Массив функций
Массив констант
Конечно переменные в внутри функции и методы класса не нужны, их всегда можно получить зная имя класса.
А вот список имен классов, функций, это проблема если в файле есть include/require
(Добавление)
http://www[dot]tig12[dot]net/spip/Parsing-PHP-code[dot]html
Нарыл, чел решал подобную проблему и пришел к выводу что надоть использовать парсер а не машину PHP
8. JustUserR - 21 Октября, 2010 - 07:28:08 - перейти к сообщению
eai пишет:
В случае использования разбора статического исходного PHP-кода при учитывании всех особенностей оригинального анализа скриптов в PHP-интерпретаторе получение полной информации о переменных и функциях является невозможным - дело в том что язык PHP является динамическим как относительно переменных в качестве объектов первого рода так и функций в качестве объетов инициализации блока во времени исполнения В частности объявление функции может находится внутри некоторого блока кода или другого функционального элемента - в таком случае она останется недоступной как для вызова так и индексирования до тех пор пока содержащий ее блок не получит управление - в силу этой причины статический парсер принципиально не может определить необходимо ли добавлять некоторый глобальный элемент в таблицу имен или нет
Хочется то в сущности получить следующую вещь
9. eai - 21 Октября, 2010 - 10:41:43 - перейти к сообщению
JustUserR пишет:
в силу этой причины статический парсер принципиально не может определить необходимо ли добавлять некоторый глобальный элемент в таблицу имен или нет
Yes it is.
Но! таки если ум мы говорим что мы используем ООП то не следует писать код с включением чего попало и где попало.
PHP уже выходит и состояния языка с синтаксисмом и стилем аля Basic89
В больших проектах нужно применять методы и стили аналогично старшим братьям C++ Java, в противном случае код становиться хаотическим трудно и долго изменяемым и неконтролируемым.
10. rudenich - 28 Ноября, 2010 - 16:46:51 - перейти к сообщению
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- function file_get_php_classes($filepath) {
- $classes = get_php_classes($php_code);
- return $classes;
- }
- function get_php_classes($php_code) {
- for ($i = 2; $i < $count; $i++) {
- if ( $tokens[$i - 2][0] == T_CLASS
- && $tokens[$i - 1][0] == T_WHITESPACE
- && $tokens[$i][0] == T_STRING) {
- $class_name = $tokens[$i][1];
- $classes[] = $class_name;
- }
- }
- return $classes;
- }