2013-01-24 62 views
2

我很困惑如何使用&运营商减少记忆。=&运营商,记忆

我可以有以下问题的答案吗?

clase C{ 

    function B(&$a){ 
     $this->a = &$a; 

     $this->a = $a; 

     //They are the same here created new variable $this->a?? 
     // Or only $this->a = $a will create new variable? 
    } 
} 

$a = 1; 

C = new C; 
C->B($a) 

或者,也许我的理解是完全错误的.....

+1

http://php.net/manual/en/language丑陋的副作用。 references.pass.php – user1909426

+1

猜你根本不需要'&'。 – KingCrunch

回答

12

永远不要在PHP中使用引用只是为了减少内存负载。 PHP通过编写机制完美处理其内部副本。例如:

$a = str_repeat('x', 100000000); // Memory used ~ 100 MB 
$b = $a;       // Memory used ~ 100 MB 
$b = $b . 'x';     // Memory used ~ 200 MB 

如果你知道自己在做什么,需要他们功能(而这几乎从来没有,所以你可以也只是他们忘了),才应使用引用。 PHP引用很古怪,可能会导致一些意外的行为。

+0

非常感谢你!!!!! – Till

3

值类型变量才会被复制时,他们的价值变化,如果你只在你的榜样分配给它,它不会被复制,内存占用将与您未使用&运算符相同。

我建议你阅读这些文章引用传递值:

When to pass-by-reference in PHP

When is it good to use pass by reference in PHP?

http://schlueters.de/blog/archives/125-Do-not-use-PHP-references.html

它被认为是一个microoptimalization,伤害了代码

的透明度
+0

非常感谢! – Till

3

我很困惑如何使用&算子来减少记忆。

如果你不知道的话,你可能不需要它了:) &没什么用处,如今,因为在PHP核心在过去几年几项增强。通常你会使用&来避免PHP将该值复制到为第二个变量分配的内存中,但是(简而言之)让两个变量指向相同的内存。

但现在

  • 对象作为参考反正过去了。他们不克隆自理神奇,因为它们传递给方法;)
  • 当你通过原始类型,PHP将复制的价值,除非修改变量(写入时复制)。

概括起来:的&好处已经存在为核心的功能,但没有操作

+0

非常感谢,所以使用&否最终会使用相同数量的记忆?我明白了吗?对不起...... – Till

+1

'&'在用于其预定用途时几乎没有用处。我只是在昨天将'$ itemTree [$ a] [$ b] [$ id]'别名到'$ items [$ id]'来简化地狱项目的循环。 :)但第一句话是重要的一句;如果你不知道你在做什么,你几乎肯定不应该仅仅为了节省内存或其他东西而使用它。 – cHao

+0

@Till不成熟的优化是万恶之源;)你真的有这么大的内存使用,你必须照顾它,它不能通过(例如)块/分页解决吗? '&'是一个引用,意思是:如果你改变其中一个变量的值,另一个也会被改变(因为它们都指向相同的'zval'(“memory”)。你只会很难追踪错误你几乎赢不了任何东西 – KingCrunch