![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 1 Всего: 386 |
Требуется написать некий велосипед, который сейчас нужен в виде легкорасширяемого глобального класса, а в обозримом будущем может трансформироваться в ядро фреймворка. Планы максимально наполеоновские
![]() По аналогии с YII был обозначен глобальный класс-представитель, видимый в открытом космосе. Воизбежании некрасиво-длинного с моей точки зрения вызова YII::app()->handle() предлагается монтировать статические методы прямо в класс примерно так:
Чтобы добавить в класс некий новый метод, достаточно написать
Возможно кто-нибудь уже сочинять подобную "во все стороны расширяемую" штуку. Какие есть/остались впечатления от пользования перекрытия статических методов с помощью __callStatic? Может какие серьезные потери в производительности есть? Есть ли аналог для перехвата неизвестных статических методов для версии 5.2? Может там работает __call? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
||||
|
|||||
Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 1 Всего: 42 |
А проверить? ![]() -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
Sanchezzz |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1670 Регистрация: 19.11.2006 Где: Voronezh Репутация: 2 Всего: 60 |
в 5.2 есть __call вроде работает использую в собственном фреймворке в контроллерах как 404 ошибку если метод через __call не нашелся полностью, правда у самого стоит 5.3.
Меня тоже в уааяй раздражает писать длинные цепочки -------------------- Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS. |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 1 Всего: 386 |
Не, не работает для статических классов, только так, как в YII. Это немного обидно, так как не на всех моих площадках пока стоит 5.3 :( Работает, но не для статического вызова. Так что придется писать длинно и некрасиво ![]() -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 1 Всего: 386 |
В итоге - принято волюнтаристкое решение технично наплевать на 5.2 и писать в терминах 5.3.
Для деплоя на сервера с 5.2 будет производится текстовая замена
а в остальных файлах все ENGINE:: будут заменяться на ENGINE::$I-> осталось только не запутаться по дороге и не написать что-то совсем уж несовместимое ... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 1 Всего: 386 |
Небольшое пояснение по сути принятого выше решения.
Простенький benchmark предложенного в первом посте кода, после небольшого допиливания, на 4 варианта вызова
Если расшифровать, то первый вариант - это просто накладные расходы на вызов самой функции Дополнительные расходы на __call и __callStatic составляют 0,05 на 10к вызовов и примерно равны между собой. Этот факт меня, собственно и поразил. Мне казалось, что __call в этом варианте должен проиграть __callStatic. Дополнительные расходы на __call и выдачу инстанса составляют 0,07 на 10к. Понятно, что это все "спички", но на чем еще экономить в "ядрёном" коде? Это сообщение отредактировал(а) ksnk - 22.9.2012, 15:48 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
Sanchezzz |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1670 Регистрация: 19.11.2006 Где: Voronezh Репутация: 2 Всего: 60 |
странно что __call в старых версия будет так работать
тест был сделан без анонимных функций ? function(){ ... }
тут урезать то нечего все просто) Это сообщение отредактировал(а) Sanchezzz - 22.9.2012, 18:06 -------------------- Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS. |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 1 Всего: 386 |
Да. Устанавливался в качестве стороннего обработчика тот же самый ENGINE::error. Все многообразие новых возможностей 5.3 мне пока нельзя применять :( Пока остается несколько хостов на 5.2. Хорошо, хоть с 4-ки все уже слезли. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 1 Всего: 386 |
потихоньку оформляется. Дописан сервис хранения параметров - set_option - установить и option - получить параметр по имени
Обнаружил еще некоторую пользу. Естественно и просто выходит ленивая загрузка. Для этого достаточно устанавливать обработчиками событий и интерфейсов статические методы классов. Все интерфейсные закладки нужно хранить в файле параметров, их значения будут, таким образом, строковыми и не нуждаются в предварительной загрузке файлов.
Таким образом только при явном вызове функции-расширения, будет через autoload подгружен нужный класс. Придумался также довольно забавный способ вызова конструктора объекта, который непосредственно реализует этот интерфейс.
Основной смысл - "начальная функция" интерфейса - сама и является конструктором объекта. Она обязана проанализировать ситуацию и установить правильный интерфейсный обработчик. Случай с файловым логером переусложнен, можно было пользоваться error_log'ом и обойтись статической функцией, но тогда было бы не так показательно ... Вообще, с возможностью переустановки "функций" в "объекте" на лету - чисто Javascript'овский прием. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
||||
|
|||||
Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 1 Всего: 42 |
А можно более реальный пример когда это "кровь из носу" нужно? Просто отсутствие нормальной поддержки таких выкрутасов со стороны IDE резко ограничивает размер кодовой базы проекта, а значит и область применения. -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 1 Всего: 386 |
Ну вот же, я выше пытался продемонстрировать. Во имя обеспечения ленивой загрузки, объекты и сущности окружающего мира инициируются фактом первого к ним обращения. Таким образом - первое обращение к сущности должно быть вызовом инициализатора (конструктора) самой сущности, а дальнейшие вызовы будут оперировать уже с конкретной функцией конкретного объекта. В моем случае, вызов первый вызов ENGINE::log('some message') приведет к подгрузке файла с логером и вызову ENGINE_logger::log(...). Эта функция в процессе выполнения анализирует параметры конфигурации системы и выясняет - какую конкретно функцию система предпочитает использовать, вывод в файл или вывод в базу. После чего, обработчиком соответствующего интерфейса ENGINE::log становится конкретная функция и окружение инициализируется (контроль таблицы для базы или открытие файла для файла). Второе и следующие обращения уже вызовет конкретную функцию, у которой корректно проинициализировано окружение. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 1 Всего: 42 |
ksnk, мысль я вобщем-то понял.
Я не понял какие удобства это дает в сравнении с существующими вариантами. -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 1 Всего: 386 |
Я пока тоже не понял ![]() В добавок, получается довольно удобное ядро для маленьких php-утилит. Надо для тестирования системы переписать что-нибудь из своих велосипедов... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Для профи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |