PHP是否提供任何懒惰副本概念?
我相信懒惰副本不是用PHP实现的(事实上它是一个正确的术语吗?)而延迟加载可以通过对象的简单标志属性在对象属性上实现。
我在SO上发现answer(Please see)有大量的upvote,部分解释似乎完全错误。
他说的是,除非$ b未被更改,否则$ a将仅保留$ b的参考。
$b=3;
$a=$b;
// $a points to $b, equals to $a=&$b
$b=4;
// now PHP will copy 3 into $a, and places 4 into $b
我可以理解延迟加载。在对象中保留一个标志属性,每当我们尝试获取对象的属性时,只需从DB初始化所有属性。伪代码如下所示:
private function GetAccessor($member) {
if($this->isLoaded != true) {
$this->Load(); //initialize or copy all properties from DB - LAZY LOADING
}
....
注意:php.net也没有在任何地方提到过懒人副本。
答案 0 :(得分:4)
我相信Lazy副本没有实现
它已实现,称为COW(Copy-on-Write)
请参阅:
答案 1 :(得分:4)
嗯,PHP就是这样做的。这是php解释器为您完成的优化策略。这个概念也被称为“写作时复制”。
假设你有一个很大的字符串
$a = "lllloooooong [imagine another million characters here]";
然后你要复制那个:
$b = $a;
然后很可能,执行此复制操作从来都不是必需的,因为要么你从未改变$ a或$ b意味着两个变量始终具有相同的值,因此你可以使用$ a OR $ b来减少你的内存消耗减少50%并节省您的复制操作。
因此,PHP解释器将在第一个操作$b = $a
上假设您可能永远不会更改$ a或$ b并且它不会进行任何复制,而是会记住$ b具有与美元。一旦你改变$ b或者你改变$ a后,解释器的先前假设被证明是错误的,并且解释器毕竟会进行复制。
但是这种行为是在幕后发生的一种操作。你没有看到它,你不能直接影响它,它没有任何影响,你必须知道,以编码PHP。相反,您可以像处理变量一样立即工作。