Со ссылкой на this вопрос, я получил другое решение использование__clone() vs unserialize (serialize())?
$obj2 = unserialize(serialize($obj1));
вместо
$obj2 = clone $obj1;
Какой из них лучше использовать?
Со ссылкой на this вопрос, я получил другое решение использование__clone() vs unserialize (serialize())?
$obj2 = unserialize(serialize($obj1));
вместо
$obj2 = clone $obj1;
Какой из них лучше использовать?
Т.Л., версия др: Использование clone
для простых объектов и деревьев, unserialize(serialize())
для сложных графов объектов.
Longer объяснение: Если $obj1
орудия __clone()
, выражение clone $obj1
вернет неполную копию $obj1
, но разделяя содержание объектов указывает $obj1
. Даже если __clone()
реализован для выполнения глубокой копии рекурсивным clone
членов, он будет работать только безопасно, если граф объектов является деревом. Если граф объекта содержит циклы, он будет рекурсивно работать и ... ну ... это переполнение стека по какой-то причине. :-) Если это ориентированный ациклический граф, но не дерево, любой объект, на который ссылаются несколько раз, будет иметь эти множественные ссылки, замененные копиями, которые могут быть не такими, какие вы хотите.
unserialize(serialize($obj1))
, с другой стороны, будет заниматься циклами в графе объектов, но более дорогостоящим с точки зрения как времени процессора, так и памяти.
+1 для «мелкого клонирования» и потенциальных проблем с глубоким клонированием –
Несомненно, это создает клон, но с невероятными накладными расходами и без возможности определять какие-либо настройки или поведения с помощью метода __clone magic.
Я бы использовал ключевое слово clone, и если вам нужны дальнейшие исследования, см. Раздел комментариев в http://php.net/manual/en/language.oop5.cloning.php для доказательств того, что клонирование не требует, чтобы к одному к нему клонировало изменение одного объекта.
клон, но я не знаю, могу ли я его «доказать». –
@ Дагон: Согласен. Но любое объяснение будет хорошим. – Gaurav
какой филлинк сказал :-) –