我知道范围在PHP和Javascript中的工作方式不同。
当我第一次开始学习Javascript(经过几年学习PHP)之后,我最初没有意识到在函数外部声明的变量也可以从里面函数中访问。
现在(经过几年关注Javascript之后的几年),我对如何将PHP函数范围变量返回到额外函数环境感到困惑。
示例:
$myArray = array();
function addItemsToMyArray($myArray) {
$myArray[] = 'apple';
$myArray[] = 'banana';
$myArray[] = 'coconut';
return $myArray;
}
addItemsToMyArray($myArray);
echo count($myArray); /* Gives 0 */
count($myArray)
为什么要0
代替3
?
答案 0 :(得分:2)
已正确设置函数addItemsToMyArray()
以将数组返回到主PHP代码,但是您忘记捕获该返回值并将其放入变量中。编写此代码并使区别更容易看到的一种方法可能是这样的:
function addItemsToMyArray($tmpArray) {
$tmpArray[] = 'apple';
$tmpArray[] = 'banana';
$tmpArray[] = 'coconut';
return $tmpArray;
}
$myArray = array();
$myArray = addItemsToMyArray($myArray);
echo count($myArray); /* Gives 3 */
函数内部使用的变量是与函数外部的$myArray
变量不同的变量。
答案 1 :(得分:2)
除非另行指定,否则函数/方法参数是按值传递的,这意味着您在函数内部获得了副本。如果希望函数更改传递给它的变量,则需要传递引用。如上所述here:
默认情况下,函数参数按值传递(如果是,则传递 函数内的参数值改变了,它没有得到 在功能之外改变了)。允许函数修改它 参数,必须通过引用传递。
要使函数的参数始终通过引用传递,前置 函数定义中参数名称的&符号(&):
请注意文档页面中$array
之前的&符号,以便对asort()
和ksort()
等函数进行排序:
bool asort(array& $ array [,int $ sort_flags = SORT_REGULAR])
bool ksort(array& $ array [,int $ sort_flags = SORT_REGULAR])