Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Анализ файла PHP
Форумы портала PHP.SU » PHP » Программирование на PHP » Анализ файла PHP

Страниц (1): [1]
 

1. eai - 20 Октября, 2010 - 11:50:53 - перейти к сообщению
Вот такая вот интересная задача.
Есть файл написанный на PHP
Как получить список классов, функций и переменных объявленных в нем Подмигивание
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
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:
скопировать код в буфер обмена
  1.  
  2. function file_get_php_classes($filepath) {
  3.   $php_code = file_get_contents($filepath);
  4.   $classes = get_php_classes($php_code);
  5.   return $classes;
  6. }
  7.  
  8. function get_php_classes($php_code) {
  9.   $classes = array();
  10.   $tokens = token_get_all($php_code);
  11.   $count = count($tokens);
  12.   for ($i = 2; $i < $count; $i++) {
  13.     if (   $tokens[$i - 2][0] == T_CLASS
  14.         && $tokens[$i - 1][0] == T_WHITESPACE
  15.         && $tokens[$i][0] == T_STRING) {
  16.  
  17.         $class_name = $tokens[$i][1];
  18.         $classes[] = $class_name;
  19.     }
  20.   }
  21.   return $classes;
  22. }
  23.  
11. OrmaJever - 28 Ноября, 2010 - 17:08:30 - перейти к сообщению
eai пишет:
Хочется то в сущности получить следующую вещь
Файл xxx.php
Массив внешних подключаемых модулей (include)
Массив классов
Массив переменных
Массив функций
Массив констант

На некоторые вещи естьвстроеные функции. например
get_class()
get_class_methods()
get_defined_vars()
get_included_files()
get_extension_funcs()
и т.д. Остальные можно увидеть тут
12. JustUserR - 29 Ноября, 2010 - 15:29:53 - перейти к сообщению
OrmaJever пишет:
На некоторые вещи естьвстроеные функции. например
Результат использования приведенный вами информационных функций в целях осуществленя получения данных об объектах заданного PHP-скрипта - в общем случае не включает в себя полного списка элементов с указанием их принадлежност заданному контексту - дело в том что добавления в общую таблицу имен идентификаторов заданных объетов может производиться в процессе выполнения приложения

 

Powered by ExBB FM 1.0 RC1