【问题标题】:What is the point of assigning by reference? [duplicate]通过引用分配有什么意义? [复制]
【发布时间】:2014-08-17 20:50:17
【问题描述】:

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

【问题讨论】:

  • 即编辑深度数组或 foreach 循环
  • link 可能就是你要找的东西

标签: php variables variable-assignment


【解决方案1】:

这里有一些例子:

为很长的变量创建别名

$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);

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

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

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

【讨论】:

  • 使用引用作为更复杂变量的一种“别名”的好例子!
【解决方案2】:

有一次,这可能通过避免复制长字符串来节省内存。但是现代版本的 PHP 使用写时复制,所以这不是什么大问题。

也就是说,写时复制意味着如果你分配$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
}

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

【讨论】:

  • 通过引用传递是我自己经常使用的东西。我特别好奇在调用函数或循环的地方之外通过引用进行分配。但是关于遗留内存注意事项的说明非常有趣,谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 2012-08-07
  • 2011-11-10
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
相关资源
最近更新 更多