【发布时间】:2013-01-14 20:27:54
【问题描述】:
为什么这段代码不能像我预期的那样工作? 在 Test(&$array) 函数中,我将 ref 参数设置为全局 $array1 但这不起作用。
$array1 = array();
$array2 = array();
function Test(&$array)
{
global $array1;
$array = &$array1;
$array['inside'] = 'inside';
}
//按功能设置:
Test($array2);
$array2['test1'] = 'test1';
var_dump($array1); //array('inside' => 'inside') ** WHERE IS THE 'test1' key? **
var_dump($array2); //array('test1' => 'test1') ** WHERE IS THE 'inside' key? **
//设置不带函数:
$array2 = &$array1;
$array2['test2'] = 'test2';
var_dump($array1); //array('inside' => 'inside', 'test2' => 'test2') ** FINE **
var_dump($array2); //array('inside' => 'inside', 'test2' => 'test2') ** FINE **
编辑:
很明显,如果我将 $array 更改为指向 $array1 那么 $array1 将具有 'inside' => 'inside' 值 outside 函数。如果我设置 $array2['test1'] = 'test1' 为什么不改变这个 $array1,有什么不清楚的地方?它在函数内部之前“链接”!
【问题讨论】:
-
听说过返回值吗?
-
@kingcrunch 这显然是一个简化的测试用例,因此批评一个未知的用例似乎没有什么帮助。
-
@IMSoP 好的,抱歉 :) 但老实说:多年来我从未见过有用的 in-out-params 用例,我担心它们根本不存在(不再存在) )。但是我已经看到了微优化的传递引用(此外:它没有优化任何东西,因为写时复制)然后相同的开发人员感到困惑,因为数组“神奇地”改变了,因为其他一些使用数组,比如一个使用数组,作为参数传递:) 我想说的是:没有真正的用例,但许多“wtf”-momemts 正在等待。
-
@KingCrunch:真正的函数应该返回布尔值,同时通过引用设置多个参数值。这是我的 .NET C# 解决方案中的一种设计模式。我就是喜欢用php来实现。
-
@ggabor 这种“返回值作为状态参数”是一个坏习惯。当你的方法失败时,使用异常,当它成功时,......好吧,不要抛出异常;)然后继续。这就是异常存在的原因:通知您(并让您有机会对)异常情况做出反应。公平地说:也许在其他语言中它是一种更被采用的模式,但至少在我所知道的语言中不是:)(我对 C 系列不太熟悉)
标签: php arrays function reference