Объекты в строки, уникальные ключи в PHP - PullRequest
3 голосов
/ 15 июня 2011

Я читал о паттерне 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 и я полагаю, что это мой лучший выбор, однако не стесняйтесь делиться своими мыслями.

Ответы [ 3 ]

1 голос
/ 15 июня 2011

Вы правы, что так больше не работает.Возможно, вы захотите использовать какую-то другую функцию вместо этого: spl_object_hash()

function attach(Observer $observer){
    $this->_observers[spl_object_hash($observer)] = $observer;
}

function detach(Observer $observer){
    unset($this->_observers[spl_object_hash($observer)]);
}

Подход, основанный на сериализации, имеет проблему проектирования, кстати: я перестаю работать, когда объекты идентичны по значению или по-другомуслова, если объекты возвращают одно и то же сериализованное значение, например, NULL.Это полностью контролируется самими объектами, когда они реализуют интерфейс Serializable .

1 голос
/ 15 июня 2011

В качестве альтернативы вы можете использовать SplObjectStorage напрямую.

как:

function __construct(...){
    $this->_observers = new SplObjectStorage;
}

function attach(Observer $observer) {
    $this->_observers[$observer] = $observer;
}

function detach(Observer $observer){
    unset($this->_observers[$observer]);
}
1 голос
/ 15 июня 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...