Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> __autoload() и функции, Возможно ли? 
:(
    Опции темы
CyClon
Дата 7.10.2007, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



В общем, удобная и очень гибка фишка __autoload для классов smile Хотелось бы что-то вроде этого и для функций.

Такое вообще возможно? Какие есть идем? В какую сторону копать? smile


--------------------
user posted image
PM   Вверх
WolfON
Дата 7.10.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: 1
Всего: 8



Не понятно что требуется от функций

В классе можно перегрузить __call - к нему обращается, если функция не найдена
PM MAIL ICQ   Вверх
Rock
Дата 7.10.2007, 16:40 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 264
Регистрация: 13.1.2005
Где: Краснодар

Репутация: нет
Всего: 1



Если задача автоматически подключать файлы с набором функций, то я пока знаю только один метод:
Использование статических классов.
Ну и + __autoload();

PM MAIL ICQ   Вверх
CyClon
Дата 7.10.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Возможно, вы меня не поняли.

Код
<?php

myFunction($bla, $bla, $bla);

?>

Цитата
Fatal error: Call to undefined function myFunction() in C:\Dev\Apache\htdocs\Untitled-1.php on line 3


Мне нужно, чтобы этой ошибки не было. Алгоритм - такой же как и у __autoload, только грузить нужно не классы, а функции.

То есть, мне нужно, чтобы следующий пример кода перед тем как выдать Fatal error попытался передать имя функции в функцию __fautoload, и только тогда, если функцию до сих пор не определена - выдавал FE.

/index.php
Код
<?php

function __fautoload($function)
{
    require($function . '.function.php');
}

myFunction($bla, $bla, $bla);

?>

/myFunction.function.php
Код
<?php

function myFunction($arg1, $arg2, $arg3)
{
    echo $arg1 . $arg2 . $arg3;
}

?>



--------------------
user posted image
PM   Вверх
WolfON
Дата 7.10.2007, 21:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: 1
Всего: 8



нет, такого нету

можно сделать класс-оболочку, который будет получать все вызовы функций, инклудить нужный класс или файл и вызывать функцию

типа widget::func_name()...но это по-моему костыль жуткий и не удобно
PM MAIL ICQ   Вверх
chin
Дата 7.10.2007, 22:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



CyClon
Помоему, это в корне извращение, держать каждую функцию в отдельном файле... (:

Цитата(WolfON @  7.10.2007,  21:10 Найти цитируемый пост)
можно сделать класс-оболочку, который будет получать все вызовы функций, инклудить нужный класс или файл и вызывать функцию
типа widget::func_name()...но это по-моему костыль жуткий и не удобно

__call() не работает для статических вызовов.

PM MAIL   Вверх
sTa1kEr
Дата 7.10.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Rock совершенно прав. Просто используйте статические методы вместо функций, тогда будет работать __autoload(). 

Цитата(chin @  7.10.2007,  22:14 Найти цитируемый пост)
__call() не работает для статических вызовов.

__call() тут совершенно не причем. Смысл в том, что реально существуют статические методы в "статическом" классе. Все просто и не нужны никакие костыли.
PM MAIL   Вверх
chin
Дата 7.10.2007, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



Цитата(sTa1kEr @  7.10.2007,  23:12 Найти цитируемый пост)

__call() тут совершенно не причем. Смысл в том, что реально существуют статические методы в "статическом" классе. Все просто и не нужны никакие костыли.

Цитата(WolfON @  7.10.2007,  21:10 Найти цитируемый пост)

можно сделать класс-оболочку, который будет получать все вызовы функций, инклудить нужный класс или файл и вызывать функцию

Помоему, здесь речь шла именно об одном вгемогучем классе-оболочке, который "будет получать все вызовы функций".

Я, конечно же, тоже за группирование функцию по статическим классам, раз уж процедурный подход.
PM MAIL   Вверх
sTa1kEr
Дата 7.10.2007, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Цитата(chin @  7.10.2007,  23:20 Найти цитируемый пост)
Помоему, здесь речь шла именно об одном вгемогучем классе-оболочке, который "будет получать все вызовы функций".

Хм, прошу прощенья, не внимательно прочитал. Тогда действительно только через инстанс.
PM MAIL   Вверх
CyClon
Дата 8.10.2007, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Код
CyClon, 
Помоему, это в корне извращение, держать каждую функцию в отдельном файле... (:


Да, ну... Если я пишу CMS, у меня есть куча функций типа convertSize (конвертирует байты в более высокие велечины), checkMail (проверяет правильность адреса е-маил) и т.д. В общем функции разного применения. Мне было бы удобно написать их и раскидать по соответствующим файлам. Потом я (или кто другой) пишет модуль для CMS, ему  нужно конвертировать байты в другие велечины (например это каталог файлов). Человек просто напишет convertSize($size), то файл с функцией подгрузится и все будет ок. Если какая-либо функция не используется на странице, то она вообще не подгружается. Соответственно не тратится время на ее include + определение.

Если сабж не кактит, тогда придется или подгружать ВСЕ функции из каталога functions, получив высокую гибкость, но низкую производительность... Или при разработке каждого модуля заботиться от include нужной функции в скрипт. Но тут может быть косяк, если функции уже определена (например используется в каком-то блоке)... В общем __autoload для функций это мега-удобно было бы, как впрочем и для классов.


--------------------
user posted image
PM   Вверх
chin
Дата 8.10.2007, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



CyClon,
Во первых, на разовое подключение одного большого файла уйдет меньше времени, нежели на множество атомарных подключений мелких файлов.
Во вторых, можно легко найти для каждой функции свой логический контейнер. Например, для convertSize можно отнести к классу Data (класс для работы с данными - к примеру), checkMail - к классу Validators. Ну а то, что действительно не подходит ни для какого логического определения, поместить в functions.php, который будет подключаться всегда. И пропадут у Вас все проблемы.

Поверьте, ООП не зря придумали. Посмотрите на Zend_Framework - у них ни одной функции нету.
PM MAIL   Вверх
sTa1kEr
Дата 8.10.2007, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Цитата(chin @  8.10.2007,  14:07 Найти цитируемый пост)
Во первых, на разовое подключение одного большого файла уйдет меньше времени, нежели на множество атомарных подключений мелких файлов.

Не факт. А вот памяти  PHP при этом сожрет много.

Цитата(CyClon @  8.10.2007,  12:48 Найти цитируемый пост)
Потом я (или кто другой) пишет модуль для CMS, ему  нужно конвертировать байты в другие велечины (например это каталог файлов). Человек просто напишет convertSize($size), то файл с функцией подгрузится и все будет ок.

Имхо, в данном случае функции вообще противопоказаны. Если пишутся модули или просто коллективная разработка, то лучше описать интерфейс со необходимым функционалом и создать менеджер, который будет заботится о поисках и подключениях этих модулей и возвращать объекты классов реализующие этот интерфейс.
PM MAIL   Вверх
chin
Дата 8.10.2007, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



Цитата(sTa1kEr @  8.10.2007,  14:34 Найти цитируемый пост)
Не факт. А вот памяти  PHP при этом сожрет много.

Поместите 100 функций в один файл и подключите.
После чего поместите каждую функцию в индивидуальный файл и последовательно подключите каждый.
Какой процесс будет более ресурсоемким и долгим? smile

Понятно, что имеется ввиду, что не в каждом рантайме будут использоваться все функции.  Но даже если пользоваться вторым вариантом и подключить 50 файлов вместо 100, разница по затратности от первого варианта отличаться будет не сильно.

Да и если правильно проектировать, в нормальной системе больше 10 нераспределенных функций сложно придумать.

Кстати, у зенда используется такой подход в виде так называемых "хелперов", которые действительно лежат в отдельных файлах подобно функциям у CyClon.
PM MAIL   Вверх
sTa1kEr
Дата 8.10.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Цитата(chin @  8.10.2007,  14:57 Найти цитируемый пост)
Понятно, что имеется ввиду, что не в каждом рантайме будут использоваться все функции.  Но даже если пользоваться вторым вариантом и подключить 50 файлов вместо 100, разница по затратности от первого варианта отличаться будет не сильно.

А если из 100 подключить 5 функций или вообще ни одной не понадобится? К тому же еще многое зависит от размера самих функций. Зато на практике было замечено, что огромное количество функций жрет порядочно памяти, а память часто бывает даже более критична, чем время выполнения скрипта.

Цитата(chin @  8.10.2007,  14:57 Найти цитируемый пост)
Кстати, у зенда используется такой подход в виде так называемых "хелперов", которые действительно лежат в отдельных файлах подобно функциям у CyClon. 

Да, у зенда хороший подход, я придерживаюсь придерживаюсь того-же стиля.
PM MAIL   Вверх
chin
Дата 8.10.2007, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



sTa1kEr,
Ну я же и имею ввиду, что данный подход допустим в случае, если это очень редко используемые функции.

CyClon
По поводу извращения я хотел сказать, что если Вы думаете о "удобном программировании", то думайте уже всерьез и переходите на ООП ;)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0900 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.