![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| SqueeZe |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 1.10.2007 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
Здравствуйте.
Разбираюсь сейчас с обратными вызовами (callback) в php. И не очень понимаю, для чего его нужно использовать!? В книге "PHP5 для профессионалов (Новицки, Коув)" он используется для реализации позднего инстанцирования в классе Collection. Но в том примере я считаю можно обойтись и без него... (но видимо ошибаюсь Спасибо. |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: нет Всего: 70 |
||||
|
||||
| vasac |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: 8 Всего: 36 |
||||
|
||||
| SqueeZe |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 1.10.2007 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
Немного не в ту сторону. Я знаю эти функции, но не могу понять, где это можно использовать!? Для какой задачи!
Либо я дурак... Это сообщение отредактировал(а) SqueeZe - 8.1.2008, 17:37 |
|||
|
||||
| flashaa |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
Применений может быть очень много, поэтому четкое применение его callback'а сформулировать сложно - вообщем, это сделано для гибкости, чтобы можно было вызвать исполнение ф-ции, зная её имя, при этом чтобы можно было сократить код. Элементарный пример:
|
||||
|
|||||
| SqueeZe |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 1.10.2007 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
Это, честно говоря тоже понятно. Я действительно неправильно сформулировал вопрос (голова уже заклинена =) ).
Меня интересует организация позднего инстанцирования методом обратного вызова. // Многократные извинения за неправильно заданный вопрос. |
|||
|
||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
Читал я эту книгу, ту,которую описали в первом посте, сейчас оставил на работе.. С завтрашнего дня снова буду там (до свидания, выходные :( ), открою эту главу и вспомню, если будет ещё актуально, отпишусь. |
|||
|
||||
| SqueeZe |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 1.10.2007 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
О! До меня кажется доперло!!!
Сейчас приведу 2 примера. 1й - без использования обратного вызова, 2й - с использованием. 1й
И 2й
Это сообщение отредактировал(а) SqueeZe - 8.1.2008, 18:26 |
||||
|
|||||
| FractalizeR |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 273 Регистрация: 27.12.2007 Где: Россия/Москва Репутация: 2 Всего: 4 |
И где тут позднее инстанцирование?
-------------------- Чтобы поблагодарить или наоборот поругать участника форума лучше пользоваться значками "+" и "-", изменяющими репутацию. Они находятся слева от поста под именем пользователя. |
|||
|
||||
| SqueeZe |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 1.10.2007 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
Здесь позднее инстанцирование достигается путем наполнения экземпляра класса Collection (который грубо говоря является массивом объектов), ТОЛЬКО при обращении к этому экземпляру.
Если бы метод load() запихать на исполнение в конструктор, то это не позволило бы экономить ресурсы (если например load() выбирает из базы 100 записей) или даже правильнее говоря "не выполнять лишнюю работу", тк никто не знает, потребуется ли тебе работать с этим массивом или нет. Если же метод load() вызывать перед работой с массивом, то это получается не очень красиво и "приводит к снижению ясности интерфейса". |
|||
|
||||
| vasac |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: 8 Всего: 36 |
||||
|
||||
| FractalizeR |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 273 Регистрация: 27.12.2007 Где: Россия/Москва Репутация: 2 Всего: 4 |
Это позднее инстанцирование только применительно к классу B. А по отношению к классу А - это просто загрузка по требованию. Так я понимаю. -------------------- Чтобы поблагодарить или наоборот поругать участника форума лучше пользоваться значками "+" и "-", изменяющими репутацию. Они находятся слева от поста под именем пользователя. |
|||
|
||||
| SqueeZe |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 1.10.2007 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
Класс B я использовал только для того, чтобы его экземплярами заполнять Collection класса A. Можно убрать вообще этот класс и вместо:
заполнять Collection строками:
Но просто при использовании такого класса, как Collection (я кстати привел его в соседней теме [>>]), не имеет смысла заполнять его строками. Это сообщение отредактировал(а) SqueeZe - 12.1.2008, 14:48 |
||||
|
|||||
| SqueeZe |
|
||||||||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 1.10.2007 Где: Санкт-Петербург Репутация: 1 Всего: 1 |
Решил для наглядности привести еще один пример, уже с более осмысленными классами. И сам получше разберусь, авось и другим помогу =)
Рассмотрим сначала следующую заготовку.
С помощью того, что уже есть мы можем инстанцировать наш клуб и вывести его имя.
Но нам еще нужно получать информацию об исполнителях, но пока параметр $singers пуст, так как нигде не вызывается метод loadSingers(). Здесь возникает вопрос, где его вызывать. К примеру можно вызвать его в конструкторе класса Club
Но этот подход некорректен, так как если нам нужно поинтересоваться только именем клуба, метод loadSingers() все равно вызовется, хотя коллекция исполнителей нам совсем не нужна. Второй вариант - вызов метода loadSingers() перед обращением к коллекции исполнителей.
Но это тоже не совсем красиво. Так как если вы работаете не один, то остальные разработчики должны получить доступ к коллекции исполнителей исходя из знаний ими базового класса Collection, и они не обязаны знать о том, что оказывается перед тем как обращаться к коллекции, ее еще нужно заполнить при помощи некоторого метода. Это снижает ясность скрипта. Чего же мы хотим? Хотим обращаться к коллекции таким образом
Класс Collection предоставляет возможность выполнять указанную функцию перед вызовом одного из методов (getItem(), keys(), length()) при помощи встроенного метода setLoadCallback() и выполняет контроль над тем, чтобы функция была вызвана только один раз. Конечная реализация:
Это сообщение отредактировал(а) SqueeZe - 12.1.2008, 15:39 |
||||||||||||||
|
|||||||||||||||
| FractalizeR |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 273 Регистрация: 27.12.2007 Где: Россия/Москва Репутация: 2 Всего: 4 |
Тогда это вообще не инстанцирование. Инстанцирование - это создание экземпляра класса, а не заполнение его информацией. Позднее инстанцирование - позднее создание экземпляра класса тогда, когда это необходимо. -------------------- Чтобы поблагодарить или наоборот поругать участника форума лучше пользоваться значками "+" и "-", изменяющими репутацию. Они находятся слева от поста под именем пользователя. |
||||
|
|||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |