2011-02-11 3 views
3

Со ссылкой на this вопрос, я получил другое решение использование__clone() vs unserialize (serialize())?

$obj2 = unserialize(serialize($obj1)); 

вместо

$obj2 = clone $obj1; 

Какой из них лучше использовать?

+0

клон, но я не знаю, могу ли я его «доказать». –

+0

@ Дагон: Согласен. Но любое объяснение будет хорошим. – Gaurav

+1

какой филлинк сказал :-) –

ответ

10

Т.Л., версия др: Использование clone для простых объектов и деревьев, unserialize(serialize()) для сложных графов объектов.

Longer объяснение: Если $obj1 орудия __clone(), выражение clone $obj1 вернет неполную копию $obj1, но разделяя содержание объектов указывает $obj1. Даже если __clone() реализован для выполнения глубокой копии рекурсивным clone членов, он будет работать только безопасно, если граф объектов является деревом. Если граф объекта содержит циклы, он будет рекурсивно работать и ... ну ... это переполнение стека по какой-то причине. :-) Если это ориентированный ациклический граф, но не дерево, любой объект, на который ссылаются несколько раз, будет иметь эти множественные ссылки, замененные копиями, которые могут быть не такими, какие вы хотите.

unserialize(serialize($obj1)), с другой стороны, будет заниматься циклами в графе объектов, но более дорогостоящим с точки зрения как времени процессора, так и памяти.

+1

+1 для «мелкого клонирования» и потенциальных проблем с глубоким клонированием –

3

Несомненно, это создает клон, но с невероятными накладными расходами и без возможности определять какие-либо настройки или поведения с помощью метода __clone magic.

Я бы использовал ключевое слово clone, и если вам нужны дальнейшие исследования, см. Раздел комментариев в http://php.net/manual/en/language.oop5.cloning.php для доказательств того, что клонирование не требует, чтобы к одному к нему клонировало изменение одного объекта.

Смежные вопросы