您可以在下面看到两个简化的片段,它们的结果没有变化。
模式 1,从头开始的对象:
foreach ($recipients as $recipient) {
$message = new Message();
$message->setBody("This is the body of the message.");
$message->setRecipient($recipient);
$transport->sendMessage($message);
$persister->saveToDatabase($message); // Updated line
unset($message);
}
模式 2,克隆原型对象:
$prototype = new Message();
$prototype->setBody("This is the body of the message.");
foreach ($recipients as $recipient) {
$message = clone $prototype;
$message->setRecipient($recipient);
$transport->sendMessage($message);
$persister->saveToDatabase($message); // Updated line
unset($message);
}
unset($prototype);
对象克隆(模式 2(在内存使用、垃圾回收和/或 CPU 周期方面是否比从头开始创建对象(模式 1(提供了性能改进?还要考虑大量固定属性(在实例之间不会更改(和大量循环。
更新:每个循环中都需要不同的对象实例。我在示例中添加了saveToDatabase
调用以类似于它,例如让它为消息提供一个 ID。;)
看起来有人帮助你编写代码,但为了其他人访问这个问题,以下是标题中问题的答案:
通常。new
关键字会导致__construct()
魔术方法运行;clone
关键字会导致运行__clone()
魔术方法。
原型模式的要点是避免重复重新运行昂贵的构造函数,尤其是当最终结果(就对象的内部状态而言(每次都相同时。
原型模式通常仅在需要解决重大性能问题时使用,而不仅仅是在需要大量对象的情况下使用。
在您的情况下,对象克隆不是必需的。
看看这个:
$message = new Message();
$message->setBody("This is the body of the message.");
foreach ($recipients as $recipient) {
$message->setRecipient($recipient);
$transport->sendMessage($message);
}
这应该使用最少的内存。而且你不能摧毁一个物体。让 GC 为您完成。
我不确定是否需要手动取消设置。.
销毁PHP对象的最佳方法?
使用 PHP 释放内存更好的是什么:unset(( 或 $var = null
在内存使用方面,克隆应该与新对象相同,因为每个属性都被复制了。但是克隆速度稍快。看看这个基准。