| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Для профи > __autoload() и функции |
| Автор: CyClon 7.10.2007, 16:01 |
| В общем, удобная и очень гибка фишка __autoload для классов Такое вообще возможно? Какие есть идем? В какую сторону копать? |
| Автор: WolfON 7.10.2007, 16:15 |
| Не понятно что требуется от функций В классе можно перегрузить __call - к нему обращается, если функция не найдена |
| Автор: Rock 7.10.2007, 16:40 |
| Если задача автоматически подключать файлы с набором функций, то я пока знаю только один метод: Использование статических классов. Ну и + __autoload(); |
| Автор: CyClon 7.10.2007, 17:37 | ||||||||
Возможно, вы меня не поняли.
Мне нужно, чтобы этой ошибки не было. Алгоритм - такой же как и у __autoload, только грузить нужно не классы, а функции. То есть, мне нужно, чтобы следующий пример кода перед тем как выдать Fatal error попытался передать имя функции в функцию __fautoload, и только тогда, если функцию до сих пор не определена - выдавал FE. /index.php
/myFunction.function.php
|
| Автор: WolfON 7.10.2007, 21:10 |
| нет, такого нету можно сделать класс-оболочку, который будет получать все вызовы функций, инклудить нужный класс или файл и вызывать функцию типа widget::func_name()...но это по-моему костыль жуткий и не удобно |
| Автор: sTa1kEr 7.10.2007, 23:12 |
| Rock совершенно прав. Просто используйте статические методы вместо функций, тогда будет работать __autoload(). __call() тут совершенно не причем. Смысл в том, что реально существуют статические методы в "статическом" классе. Все просто и не нужны никакие костыли. |
| Автор: chin 7.10.2007, 23:20 | ||||
Помоему, здесь речь шла именно об одном вгемогучем классе-оболочке, который "будет получать все вызовы функций". Я, конечно же, тоже за группирование функцию по статическим классам, раз уж процедурный подход. |
| Автор: sTa1kEr 7.10.2007, 23:31 | ||
Хм, прошу прощенья, не внимательно прочитал. Тогда действительно только через инстанс. |
| Автор: CyClon 8.10.2007, 12:48 | ||
Да, ну... Если я пишу CMS, у меня есть куча функций типа convertSize (конвертирует байты в более высокие велечины), checkMail (проверяет правильность адреса е-маил) и т.д. В общем функции разного применения. Мне было бы удобно написать их и раскидать по соответствующим файлам. Потом я (или кто другой) пишет модуль для CMS, ему нужно конвертировать байты в другие велечины (например это каталог файлов). Человек просто напишет convertSize($size), то файл с функцией подгрузится и все будет ок. Если какая-либо функция не используется на странице, то она вообще не подгружается. Соответственно не тратится время на ее include + определение. Если сабж не кактит, тогда придется или подгружать ВСЕ функции из каталога functions, получив высокую гибкость, но низкую производительность... Или при разработке каждого модуля заботиться от include нужной функции в скрипт. Но тут может быть косяк, если функции уже определена (например используется в каком-то блоке)... В общем __autoload для функций это мега-удобно было бы, как впрочем и для классов. |
| Автор: chin 8.10.2007, 14:07 |
| CyClon, Во первых, на разовое подключение одного большого файла уйдет меньше времени, нежели на множество атомарных подключений мелких файлов. Во вторых, можно легко найти для каждой функции свой логический контейнер. Например, для convertSize можно отнести к классу Data (класс для работы с данными - к примеру), checkMail - к классу Validators. Ну а то, что действительно не подходит ни для какого логического определения, поместить в functions.php, который будет подключаться всегда. И пропадут у Вас все проблемы. Поверьте, ООП не зря придумали. Посмотрите на Zend_Framework - у них ни одной функции нету. |
| Автор: sTa1kEr 8.10.2007, 14:34 | ||||
Не факт. А вот памяти PHP при этом сожрет много.
Имхо, в данном случае функции вообще противопоказаны. Если пишутся модули или просто коллективная разработка, то лучше описать интерфейс со необходимым функционалом и создать менеджер, который будет заботится о поисках и подключениях этих модулей и возвращать объекты классов реализующие этот интерфейс. |
| Автор: chin 8.10.2007, 14:57 |
Поместите 100 функций в один файл и подключите. После чего поместите каждую функцию в индивидуальный файл и последовательно подключите каждый. Какой процесс будет более ресурсоемким и долгим? Понятно, что имеется ввиду, что не в каждом рантайме будут использоваться все функции. Но даже если пользоваться вторым вариантом и подключить 50 файлов вместо 100, разница по затратности от первого варианта отличаться будет не сильно. Да и если правильно проектировать, в нормальной системе больше 10 нераспределенных функций сложно придумать. Кстати, у зенда используется такой подход в виде так называемых "хелперов", которые действительно лежат в отдельных файлах подобно функциям у CyClon. |
| Автор: sTa1kEr 8.10.2007, 15:44 | ||||
А если из 100 подключить 5 функций или вообще ни одной не понадобится? К тому же еще многое зависит от размера самих функций. Зато на практике было замечено, что огромное количество функций жрет порядочно памяти, а память часто бывает даже более критична, чем время выполнения скрипта.
Да, у зенда хороший подход, я придерживаюсь придерживаюсь того-же стиля. |
| Автор: chin 8.10.2007, 15:54 |
| sTa1kEr, Ну я же и имею ввиду, что данный подход допустим в случае, если это очень редко используемые функции. CyClon, По поводу извращения я хотел сказать, что если Вы думаете о "удобном программировании", то думайте уже всерьез и переходите на ООП ;) |
| Автор: Fally 9.10.2007, 12:58 | ||
А не могли бы вы результаты профайлинга XDebug'ом выложить для этого варианта, вот просто интересно, действительно ли всё это так производительность снижает... |
| Автор: sTa1kEr 9.10.2007, 18:38 | ||
XDebug-ом не проверял, а так через microtime() получается, что подключить 100 файлов с маленькими функциями (около 20 строк каждая) на порядок дольше чем один файл с теми-же 100 функциями. Хотя если функции будут большие, то разница должна быть поменьше. |
| Автор: Nchanged 1.11.2007, 16:47 | ||
Каждый класс в отдельном файле, имхо удобно. При объявляение класса, скажем $test = new test; автоматически инклюдится test.php, что уменьшает нагрузку на систему, классы подгружается в зависимости от необходимости |
| Автор: HotHead 1.11.2007, 21:33 |
| Пора переходить на Perl. А вообще правильно говорят, по-моему. Я уже так привык к ООП, что функция сама по себе (если она не введена в том же файле и это действительно имело смысл по какой-то причине) мне режет глаз. Я стараюсь минимум их все запихивать в пакеты (в классы тобишь) с называнием, совпадающем с названием файла. И если кому-то придётся сопровождать мой код, то это окажет ему неоценимую помощь. А так некоторые деятели понапишут голых функций и потом ищи ветра в поле. Кучу времени приходится тратить чтобы перебрать подключенные файлы и найти нужную функцию. |