![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
CyClon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 3.12.2005 Репутация: нет Всего: 4 |
В общем, удобная и очень гибка фишка __autoload для классов
![]() Такое вообще возможно? Какие есть идем? В какую сторону копать? ![]() |
|||
|
||||
WolfON |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 604 Регистрация: 19.7.2004 Репутация: 1 Всего: 8 |
Не понятно что требуется от функций
В классе можно перегрузить __call - к нему обращается, если функция не найдена |
|||
|
||||
Rock |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 264 Регистрация: 13.1.2005 Где: Краснодар Репутация: нет Всего: 1 |
Если задача автоматически подключать файлы с набором функций, то я пока знаю только один метод:
Использование статических классов. Ну и + __autoload(); |
|||
|
||||
CyClon |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 3.12.2005 Репутация: нет Всего: 4 |
Возможно, вы меня не поняли.
Мне нужно, чтобы этой ошибки не было. Алгоритм - такой же как и у __autoload, только грузить нужно не классы, а функции. То есть, мне нужно, чтобы следующий пример кода перед тем как выдать Fatal error попытался передать имя функции в функцию __fautoload, и только тогда, если функцию до сих пор не определена - выдавал FE. /index.php
/myFunction.function.php
|
||||||||
|
|||||||||
WolfON |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 604 Регистрация: 19.7.2004 Репутация: 1 Всего: 8 |
нет, такого нету
можно сделать класс-оболочку, который будет получать все вызовы функций, инклудить нужный класс или файл и вызывать функцию типа widget::func_name()...но это по-моему костыль жуткий и не удобно |
|||
|
||||
chin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 28.10.2006 Репутация: нет Всего: нет |
CyClon,
Помоему, это в корне извращение, держать каждую функцию в отдельном файле... (: __call() не работает для статических вызовов. |
|||
|
||||
sTa1kEr |
|
|||
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
Rock совершенно прав. Просто используйте статические методы вместо функций, тогда будет работать __autoload().
__call() тут совершенно не причем. Смысл в том, что реально существуют статические методы в "статическом" классе. Все просто и не нужны никакие костыли. |
|||
|
||||
chin |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 28.10.2006 Репутация: нет Всего: нет |
Помоему, здесь речь шла именно об одном вгемогучем классе-оболочке, который "будет получать все вызовы функций". Я, конечно же, тоже за группирование функцию по статическим классам, раз уж процедурный подход. |
||||
|
|||||
sTa1kEr |
|
|||
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
||||
|
||||
CyClon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 3.12.2005 Репутация: нет Всего: 4 |
Да, ну... Если я пишу CMS, у меня есть куча функций типа convertSize (конвертирует байты в более высокие велечины), checkMail (проверяет правильность адреса е-маил) и т.д. В общем функции разного применения. Мне было бы удобно написать их и раскидать по соответствующим файлам. Потом я (или кто другой) пишет модуль для CMS, ему нужно конвертировать байты в другие велечины (например это каталог файлов). Человек просто напишет convertSize($size), то файл с функцией подгрузится и все будет ок. Если какая-либо функция не используется на странице, то она вообще не подгружается. Соответственно не тратится время на ее include + определение. Если сабж не кактит, тогда придется или подгружать ВСЕ функции из каталога functions, получив высокую гибкость, но низкую производительность... Или при разработке каждого модуля заботиться от include нужной функции в скрипт. Но тут может быть косяк, если функции уже определена (например используется в каком-то блоке)... В общем __autoload для функций это мега-удобно было бы, как впрочем и для классов. |
|||
|
||||
chin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 28.10.2006 Репутация: нет Всего: нет |
CyClon,
Во первых, на разовое подключение одного большого файла уйдет меньше времени, нежели на множество атомарных подключений мелких файлов. Во вторых, можно легко найти для каждой функции свой логический контейнер. Например, для convertSize можно отнести к классу Data (класс для работы с данными - к примеру), checkMail - к классу Validators. Ну а то, что действительно не подходит ни для какого логического определения, поместить в functions.php, который будет подключаться всегда. И пропадут у Вас все проблемы. Поверьте, ООП не зря придумали. Посмотрите на Zend_Framework - у них ни одной функции нету. |
|||
|
||||
sTa1kEr |
|
|||
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
Не факт. А вот памяти PHP при этом сожрет много. Имхо, в данном случае функции вообще противопоказаны. Если пишутся модули или просто коллективная разработка, то лучше описать интерфейс со необходимым функционалом и создать менеджер, который будет заботится о поисках и подключениях этих модулей и возвращать объекты классов реализующие этот интерфейс. |
|||
|
||||
chin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 28.10.2006 Репутация: нет Всего: нет |
Поместите 100 функций в один файл и подключите. После чего поместите каждую функцию в индивидуальный файл и последовательно подключите каждый. Какой процесс будет более ресурсоемким и долгим? ![]() Понятно, что имеется ввиду, что не в каждом рантайме будут использоваться все функции. Но даже если пользоваться вторым вариантом и подключить 50 файлов вместо 100, разница по затратности от первого варианта отличаться будет не сильно. Да и если правильно проектировать, в нормальной системе больше 10 нераспределенных функций сложно придумать. Кстати, у зенда используется такой подход в виде так называемых "хелперов", которые действительно лежат в отдельных файлах подобно функциям у CyClon. |
|||
|
||||
sTa1kEr |
|
|||
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
А если из 100 подключить 5 функций или вообще ни одной не понадобится? К тому же еще многое зависит от размера самих функций. Зато на практике было замечено, что огромное количество функций жрет порядочно памяти, а память часто бывает даже более критична, чем время выполнения скрипта.
Да, у зенда хороший подход, я придерживаюсь придерживаюсь того-же стиля. |
|||
|
||||
chin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 28.10.2006 Репутация: нет Всего: нет |
sTa1kEr,
Ну я же и имею ввиду, что данный подход допустим в случае, если это очень редко используемые функции. CyClon, По поводу извращения я хотел сказать, что если Вы думаете о "удобном программировании", то думайте уже всерьез и переходите на ООП ;) |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Для профи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |