Скрипт индексирует все .php-файлы в указанной директории, кэширует информацию о найденных классах. Разбор .php файлов осуществляется с помощью Tokenizer. Кэшируются имена найденных классов, кэшируется сопоставление имя файла — класс для последующего использования в автолоадере.
Список классов представляется в виде дерева. Для каждого класса доступен список методов, свойств. Доступен просмотре базового класса и имплементированных интерфейсов. Данные о «составе» классов получаются на ходу через PHP reflection API. Данные подгружаются через AJAX.
Интерфейс выполнен на ExtJS. Этим обусловлена поддержка браузеров — работает в IE6+, FF1.5+, Safari 3+, Opera 9+ (PC, Mac)
дерево отрисовалось, проверял в ff 3.0.11 и ie8 :)
ради интереса даже в фаирбаге глянул — при выборе элемента из дерева идет пост запрос на phpreflector.elifantiev.ru/reflector.php, а в ответ ничего не приходит…
Пардон, перепутал.
Там задумана отрисовка докблоков, но на текущем хостинге она почему-то не работает, ReflectionClass::getDocComment возвращает false =(
На моей машине с PHP5.2.4 работает, а на хостинге с 5.2.9 — нет. Исследую почему так…
Latency будет гигантским(если например будет включен хотя бы highlight + autocomplete) даже для человека, который пользуется ide. А уж для юзеров vim, которые вообще командами «пишут»…
Вся надежда только на технологии, которые встраиваются на клиенте(beyond active x), то тогда нафига нам браузер :-)
Нет. get_declared_classes() показывает объявленные в данный момент классы. Все равно надо пробегаться по исходникам как минимум подгружать все найденное.
Эта функция, естественно, не знает о классах написанных но не загруженных.
Теряется суть. Задумывалось как отдельный скрипт который можно загрузить в абсолютно неизвестный проект и с помощью него посмотреть имеющиеся классы, их структуру и иерархию.
PHPShop (PHPShop CMS 2.2.2.2 Free version) настолько убог (помимо FCKEditor и Dumper там целых 3 своих класса) и крив в плане ООП (классы там используются для хранения функций) что это не тот продукт на котором надо демонстрировать Reflector.
Предложите другой достойный бесплатный незаобфускейченный ООП-проект — сделаю HowTo.
Что-то уж очень понравилась идея с Reflection и мониторингом за загруженными классами и т. п. в общем написал плагин к ZFDebug:
Еще скриншотов можно посмотреть тут: ZFDebug Reflection Plugin.
Сейчас плагин показывает все загруженные расширения php, их директивы из php.ini, константы функции и классы в виде дерева (jQuery), для функций и классов так же используется Reflection; Так же отображаются все объявленные интерфейсы объектов, классы и функции ( пользовательские отображены отдельно ). Если любителея ZF и ZFDebug будет интересно — то прикручу еще кеширование и выложу в виде релиза.
На текущее состояние не вижу практического применения
Еще можно было тип возращаемого значения вывести если мне память не изменяет то примерно так
$func = new ReflectionMethod(«MyClass», «somemethod»);
gettype($func->invoke());
Как получить количество параметров и их дефолтные значения я знаю. Как вызвать функцию не передав ей ни одного параметра? Какие параметры передать чтобы функция вернула результат в не допустим null или не кинула Exception?
Да это все ясно
Но сама функция для меня черный ящик, известно лишь имя и количество аргументов.
Вызов функции без какого либо окружения и с непонятно какими аргументами (их значениями) не дает никаких гарантий получения в ответ результата нужного типа.
А раз нет гарантии получить достоверный результат не стоит и пользоваться такой придротной схемой определения возвращаемого значения.
комментарии (36)
только вот не понял, почему в див «doc» ничего не подгружается?
делал нечто подобное для бэкенда своей системы на codeigniter + jquery (управления контроллерами, моделями и представлениями).
ради интереса даже в фаирбаге глянул — при выборе элемента из дерева идет пост запрос на phpreflector.elifantiev.ru/reflector.php, а в ответ ничего не приходит…
Там задумана отрисовка докблоков, но на текущем хостинге она почему-то не работает, ReflectionClass::getDocComment возвращает false =(
На моей машине с PHP5.2.4 работает, а на хостинге с 5.2.9 — нет. Исследую почему так…
...
/**
* @category ZFDebug
* @package ZFDebug_Controller
* @subpackage Plugins
* @copyright Copyright © 2008-2009 ZF Debug Bar Team (zfdebug.googlecode.com)
* @license code.google.com/p/zfdebug/wiki/License New BSD License
*/
class ZFDebug_Controller_Plugin_Debug_Plugin_Reflection extends Zend_Controller_Plugin_Abstract implements ZFDebug_Controller_Plugin_Debug_Plugin_Interface
...
Вся надежда только на технологии, которые встраиваются на клиенте(beyond active x), то тогда нафига нам браузер :-)
Эта функция, естественно, не знает о классах написанных но не загруженных.
Плюс в том что данные обновляются на ходу, по мере обновления классов. Не надо перегенерировать ничего. Разве только классы переиндексировать иногда.
Когда я изучал .NET и SharePoint мне аналогичная утилита очень помогла (Red Gate's .NET Reflector) в изучении внутренних механизмов классов SharePoint
Предложите другой достойный бесплатный незаобфускейченный ООП-проект — сделаю HowTo.
нужны ли какие-то дополнительные компоненты или хватит Ext Core?
Еще скриншотов можно посмотреть тут: ZFDebug Reflection Plugin.
Сейчас плагин показывает все загруженные расширения php, их директивы из php.ini, константы функции и классы в виде дерева (jQuery), для функций и классов так же используется Reflection; Так же отображаются все объявленные интерфейсы объектов, классы и функции ( пользовательские отображены отдельно ). Если любителея ZF и ZFDebug будет интересно — то прикручу еще кеширование и выложу в виде релиза.
Еще можно было тип возращаемого значения вывести если мне память не изменяет то примерно так
$func = new ReflectionMethod(«MyClass», «somemethod»);
gettype($func->invoke());
public ReflectionParameter[] getParameters()
А если возникнут еще вопросы то можно почитать здеся www.php.net/manual/ru/language.oop5.reflection.php ))
Но сама функция для меня черный ящик, известно лишь имя и количество аргументов.
Вызов функции без какого либо окружения и с непонятно какими аргументами (их значениями) не дает никаких гарантий получения в ответ результата нужного типа.
А раз нет гарантии получить достоверный результат не стоит и пользоваться такой придротной схемой определения возвращаемого значения.
для индексации нужно вызвать reflector.php?indexClasses