通过引用分配的重点是什么?

时间:2014-06-26 20:53:05

标签: php variables variable-assignment

一个简单的问题只是为了满足我的好奇心。在PHP中通过引用分配变量有什么意义?我得到了引用如何工作以及它如何有用(比如通过引用传递)。但有没有任何实际情况我真的需要或喜欢通过引用分配? (例如在$a =& $b;中)。为什么我要创建两个基本上指向相同值的变量名,并且对它们中的任何一个做任何事情也会对另一个起作用?为什么我不能只对原始变量进行所有操作,如果我需要分叉值,只能分配(但不能通过引用)另一个操作?

2 个答案:

答案 0 :(得分:2)

有一段时间,这可能会通过避免复制长字符串来节省内存。但现代版本的PHP使用copy-on-write,所以这不是一个问题。

也就是说,写入时复制意味着如果指定$a = $b,它实际上并没有使用更多内存。 $a内部指向$b指向的内存中的相同内容。但它们并不应该像引用那样被链接起来。因此,如果您修改$b,那么当时PHP会使$a成为原始值$b的物理副本。如果修改$a,则会为其新值获取自己的内存空间。

参考对副作用仍然有用。

例如,使用foreach时:

$a = array(1, 2, 3);

foreach ($a as $value) {
  $value *= 2; // does not change contents of $a
}

foreach ($a as &$value) {
  $value *= 2; // changes contents of $a
}

或者在传递函数参数时,您希望函数修改参数的值。

答案 1 :(得分:2)

这里有一些例子:

为很长的变量制作别名

$config = array(
   'developers' =>  => array(
         'emails' => array()
      ),
);
$dev_emails = &$config['developers']['emails'];
$dev_emails[] = 'email1@tld.com';
$dev_emails[] = 'email2@tld.com';
$dev_emails[] = 'email3@tld.com';

使用不同的名称命名单个值

$result_count = mysql_num_rows();
$table_rows = &$number_of_results;

提前分配数组项目

$post = $_POST;
$time = time();
$article = array(
    'article_contents' => &$post['contents'],
    'article_title' => &$post['title'],
    'article_tags' => &$post['tags'],
    'insert_time' => &$time
);

if (array_filter($article) < 3) {
   throw new Exception("Required fields are blank");
}

$post['contents'] = striptags($post['contents']);

# imaginary model
# article::insert($article);

^这个似乎对我来说似乎不切实际,但我知道这对我有用很多次

节省内存? (只是一个理论)

还有更多应用程序只会在您编码时出现,您会注意到在您编码时它的用处