Я читал о паттерне Observer и нашел устаревшую статью .Прочитав, я заметил интересное упоминание в этом абзаце:
Ключевые методы, на которые следует обратить внимание, это: attach (), detach () и notify ().attach () и detach () обрабатывают добавление и удаление наблюдателей. Мы используем небольшую хитрость здесь.Объекты, заключенные в строковый контекст, разрешаются в уникальный идентификатор (даже если определено __toString ()).Вы можете использовать этот факт для построения ключей для ассоциативного массива. Метод notify () циклически перебирает всех прикрепленных наблюдателей, вызывая update () для каждого.Класс UploadManager вызывает notify () всякий раз, когда ему нужно сообщить что-то важное о загрузке и об ошибке, в данном случае.
Который ссылается на этот пример:
function attach(UploadObserver $obs) {
$this->observers["$obs"] = $obs;
}
Теперь, как уже упоминалосьЭта статья датирована.Преобразование объектов в строки, конечно, больше не работает таким образом ( Я запускаю 5.3.6 на своем компьютере разработчика и загружаю его для всех клиентских проектов ), но я хотел бы добиться аналогичной функциональности.Я могу думать только о ( что-то вроде ):
function attach(Observer $observer){
$this->_observers[md5(serialize($observer))] = $observer;
}
function detach(Observer $observer){
unset($this->_observers[md5(serialize($observer))]);
}
Мне любопытно, есть ли другие эффективные способы достичь этого;создание уникального ключа из самого объекта.
Предупреждение: Я не хочу входить в определенные ключи, я использую их достаточно часто с другими репозиториями и тому подобным, реализуя __set($key, $value)
,и т.д.
Примечание: Я понимаю, что MD5 не идеален.
Обновление: Только что найдено spl_object_hash и я полагаю, что это мой лучший выбор, однако не стесняйтесь делиться своими мыслями.