войти зарегистрироваться

PHP whois

индекс
169,28

Визуальный PHP-рефлектор

image
Представляю вниманию общественности визуальный PHP-рефлектор.

Скрипт индексирует все .php-файлы в указанной директории, кэширует информацию о найденных классах. Разбор .php файлов осуществляется с помощью Tokenizer. Кэшируются имена найденных классов, кэшируется сопоставление имя файла — класс для последующего использования в автолоадере.

Список классов представляется в виде дерева. Для каждого класса доступен список методов, свойств. Доступен просмотре базового класса и имплементированных интерфейсов. Данные о «составе» классов получаются на ходу через PHP reflection API. Данные подгружаются через AJAX.

Интерфейс выполнен на ExtJS. Этим обусловлена поддержка браузеров — работает в IE6+, FF1.5+, Safari 3+, Opera 9+ (PC, Mac)


Посмотреть PHPReflector в действии.
UPD: Исходники

В исходниках отсутствует Ext
Теперь Ext с минимальным набором компонентов подгружается из внешних источников через CDN (CacheFly)

Планы на будущее:
  • Причесать исходники;
  • Сделать поиск;
  • Сделать отображение не только базовых классов, но и классов, наследованных от данного;
  • Отображение DocBlock'ов для классов, методов, свойств
  • UPD: Добавить отображение штатных классов PHP

комментарии (36)

  • спасибо, очень интересно.
    только вот не понял, почему в див «doc» ничего не подгружается?

    делал нечто подобное для бэкенда своей системы на codeigniter + jquery (управления контроллерами, моделями и представлениями).
    • Там должно дерево отрисовываться как на скриншоте. Какой у вас браузер?
      • дерево отрисовалось, проверял в ff 3.0.11 и ie8 :)
        ради интереса даже в фаирбаге глянул — при выборе элемента из дерева идет пост запрос на 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
            ...
    • у меня тоже в «док» пусто. Firefox 3 0 11 в Хроме тоже пусто, только при.
      • *только при клике на BaseClass что то написало, но сейчас уже не пишет…
        • Оказалось, причина в установленном на хостинге eAccelerator. После его отключения все встало на свои места.
      • Строкой выше ответил почему так.
  • следующий шаг — онлайн редактор для php! :)
    • У нас есть некоторые наработки по этому вопросу. Единственное с чем пока столкнулись инденты по Tab и «умный» фолдинг.
      • Latency будет гигантским(если например будет включен хотя бы highlight + autocomplete) даже для человека, который пользуется ide. А уж для юзеров vim, которые вообще командами «пишут»…

        Вся надежда только на технологии, которые встраиваются на клиенте(beyond active x), то тогда нафига нам браузер :-)
  • Выложили бы исходники, чего уж там.
    • Выложил. См. выше. + на самой демо-странице ссылка.
      • Ммм… может стоит задействовать get_declared_classes()?
        • Нет. get_declared_classes() показывает объявленные в данный момент классы. Все равно надо пробегаться по исходникам как минимум подгружать все найденное.

          Эта функция, естественно, не знает о классах написанных но не загруженных.
          • Лично мне больше подходит вариант с просмотром только декларированных классов.
            • Теряется суть. Задумывалось как отдельный скрипт который можно загрузить в абсолютно неизвестный проект и с помощью него посмотреть имеющиеся классы, их структуру и иерархию.
  • Подключил бы Ext с CacheFly, выкинув все лишнее.
    • Да, планирую уменьшить Ext, спасибо
  • А думали над областью приминения?
    • Изучение структуры классов проекта например. При решенной проблеме докблоков это практичечски получается phpDocumentor lite =)

      Плюс в том что данные обновляются на ходу, по мере обновления классов. Не надо перегенерировать ничего. Разве только классы переиндексировать иногда.

      Когда я изучал .NET и SharePoint мне аналогичная утилита очень помогла (Red Gate's .NET Reflector) в изучении внутренних механизмов классов SharePoint
      • Напиши тогда how to как его прицепить к тому же PHPShop…
        • PHPShop (PHPShop CMS 2.2.2.2 Free version) настолько убог (помимо FCKEditor и Dumper там целых 3 своих класса) и крив в плане ООП (классы там используются для хранения функций) что это не тот продукт на котором надо демонстрировать Reflector.

          Предложите другой достойный бесплатный незаобфускейченный ООП-проект — сделаю HowTo.
    • Ну и еще демонстрация возможностей Reflection API и Tokenizer
  • В исходниках отсутствует Ext (для уменьшения объема).


    нужны ли какие-то дополнительные компоненты или хватит Ext Core?
    • в екст коре нет визуальных компонент вроде дерева. надо именно Extjs
  • Что-то уж очень понравилась идея с Reflection и мониторингом за загруженными классами и т. п. в общем написал плагин к ZFDebug:
    ZFDebug Reflection Plugin
    Еще скриншотов можно посмотреть тут: ZFDebug Reflection Plugin.

    Сейчас плагин показывает все загруженные расширения php, их директивы из php.ini, константы функции и классы в виде дерева (jQuery), для функций и классов так же используется Reflection; Так же отображаются все объявленные интерфейсы объектов, классы и функции ( пользовательские отображены отдельно ). Если любителея ZF и ZFDebug будет интересно — то прикручу еще кеширование и выложу в виде релиза.
  • На текущее состояние не вижу практического применения
    Еще можно было тип возращаемого значения вывести если мне память не изменяет то примерно так
    $func = new ReflectionMethod(«MyClass», «somemethod»);
    gettype($func->invoke());
    • А с аргументами как быть?
      • сам не пробовал но мануал говорит
        public ReflectionParameter[] getParameters()
        • Как получить количество параметров и их дефолтные значения я знаю. Как вызвать функцию не передав ей ни одного параметра? Какие параметры передать чтобы функция вернула результат в не допустим null или не кинула Exception?
          • Можете поставить условие public int getNumberOfParameters()
            А если возникнут еще вопросы то можно почитать здеся www.php.net/manual/ru/language.oop5.reflection.php ))
            • Да это все ясно
              Но сама функция для меня черный ящик, известно лишь имя и количество аргументов.

              Вызов функции без какого либо окружения и с непонятно какими аргументами (их значениями) не дает никаких гарантий получения в ответ результата нужного типа.

              А раз нет гарантии получить достоверный результат не стоит и пользоваться такой придротной схемой определения возвращаемого значения.
        • getParameters() не прокатывает там где используется func_get_arg() и т. п.
  • В коде опечатка:
    для индексации нужно вызвать reflector.php?indexClasses
Только авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста.