我知道这个作用域在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
?
函数 addItemsToMyArray()
已正确设置为将数组返回到主 PHP 代码,但您忘记捕获该返回值并将其放入变量中。编写此代码并使差异更容易看到的一种方法是这样的:
function addItemsToMyArray($tmpArray) {
$tmpArray[] = 'apple';
$tmpArray[] = 'banana';
$tmpArray[] = 'coconut';
return $tmpArray;
}
$myArray = array();
$myArray = addItemsToMyArray($myArray);
echo count($myArray); /* Gives 3 */
函数内部使用的变量与函数外部的$myArray
变量不同。
除非另有指定,否则函数/方法参数是按值传递的,这意味着您可以在函数中获取它们的副本。如果希望函数更改传递给它的变量,则需要按引用传递。如下所述:
默认情况下,函数参数按值传递(因此,如果函数中参数的值被更改,它不会得到在函数外部更改)。允许函数修改其参数,它们必须通过引用传递。
若要始终通过引用传递函数的参数,请在前面加上前缀函数定义中参数名称的与号 (&):
请注意文档页面中$array
前的 & 符号,用于对 asort()
和 ksort()
等函数进行排序:
布尔排序 ( 数组 &$array [, int $sort_flags = SORT_REGULAR ] )
布尔 ksort ( 数组 &$array [, int $sort_flags = SORT_REGULAR ] )