一个简单的问题只是为了满足我的好奇心。在PHP中通过引用分配变量有什么意义?我得到了引用如何工作以及它如何有用(比如通过引用传递)。但有没有任何实际情况我真的需要或喜欢通过引用分配? (例如在$a =& $b;
中)。为什么我要创建两个基本上指向相同值的变量名,并且对它们中的任何一个做任何事情也会对另一个起作用?为什么我不能只对原始变量进行所有操作,如果我需要分叉值,只能分配(但不能通过引用)另一个操作?
答案 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);
^这个似乎对我来说似乎不切实际,但我知道这对我有用很多次
节省内存? (只是一个理论)
还有更多应用程序只会在您编码时出现,您会注意到在您编码时它的用处