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)

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

4

3 回答 3

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 引用很古怪,可能会导致一些意想不到的行为。

于 2013-01-24T12:14:08.340 回答
3

值类型变量仅在其值更改时才会被复制,如果您仅在示例中分配它,它将不会被复制,内存占用将与您未使用 & 运算符时相同。

我建议您阅读这些有关通过引用传递值的文章:

何时在 PHP 中通过引用传递

什么时候在 PHP 中使用传递引用比较好?

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

它被认为是微优化,并损害了代码的透明度

于 2013-01-24T12:14:03.767 回答
3

我对如何使用 & 运算符来减少记忆感到非常困惑。

如果您不知道它,您可能不需要它 :) 现在&它非常无用,因为过去几年 PHP 核心的一些增强。通常你会&避免 PHP 将值复制到为第二个变量分配的内存中,而是(简而言之)让两个变量指向同一个内存。

但如今

  • 无论如何,对象都作为参考传递。它们不会神奇地克隆自己,因为它们被传递给一个方法;)
  • 当您传递原始类型时,PHP不会复制该值,除非您更改变量(写时复制)。

总结一下: 的好处&已经作为核心的特性存在,但没有运营商丑陋的副作用

于 2013-01-24T12:15:29.893 回答