【问题标题】:=& operator, memories=& 运算符,记忆
【发布时间】:2013-01-08 04:33:15
【问题描述】:

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

我可以回答以下问题吗?

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)

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

【问题讨论】:

标签: php memory reference


【解决方案1】:

值类型变量只会在其值改变时被复制,如果你只在你的例子中赋值它不会被复制,内存占用将与你没有使用 & 运算符一样。

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

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

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

【讨论】:

    【解决方案2】:

    永远不要在 PHP 中使用引用来减少内存负载。 PHP 用其内部的copy on write 机制完美地处理了这个问题。示例:

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

    只有当您确切知道自己在做什么并且需要它们来实现功能时,您才应该使用引用(这几乎从来没有,所以您也可以忘记它们)。 PHP 引用很古怪,可能会导致一些意想不到的行为。

    【讨论】:

      【解决方案3】:

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

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

      但是现在

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

      总结一下:& 的好处已经作为核心功能存在,但没有运算符的丑陋副作用

      【讨论】:

      • 非常感谢,所以使用 & 与否最终会使用相同数量的内存?我理解正确吗?对不起...
      • & 在用于其预期目的时几乎没有用处。我昨天才使用它来将$itemTree[$a][$b][$id] 别名为$items[$id] 以简化循环项目的地狱。 :) 但是第一句话很重要;如果你不知道你在用它做什么,你几乎肯定不应该仅仅为了节省内存或其他什么而使用它。
      • @Till 过早的优化是万恶之源;)你真的有这么大的内存使用量,你必须照顾它,而且它不能通过(例如)块来解决/分页? & 是一个引用,意思是:如果你改变一个变量的值,另一个变量也会改变(因为两个都指向同一个zval(“内存”)。你只会产生难以跟踪的错误而你几乎一无所获。
      • 非常感谢,不顾编码,求知识。非常感谢您的所有回答,我现在完全理解了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 2013-04-01
      • 2010-09-23
      • 2017-10-08
      • 2018-04-19
      • 2014-02-11
      相关资源
      最近更新 更多