在PHP中正确理解范围(与Javascript相比)

时间:2017-11-03 13:15:45

标签: php function scope global-variables

我知道范围在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

2 个答案:

答案 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])