【问题标题】:Understanding scope correctly in PHP (versus Javascript)在 PHP 中正确理解范围(与 Javascript 相比)
【发布时间】:2018-04-16 05:42:54
【问题描述】:

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

【问题讨论】:

  • 你需要写function addItemsToMyArray(&$myArray)
  • 或者使用返回值:$myArray = addItemsToMyArray($myArray);
  • 因为您的函数的参数是您的函数的本地参数,并且不要修改函数的外部范围。如果添加&,它会告诉PHP 全局写入$myArray,而不是本地写入。反正我是这么理解的。也许有人可以给出更详细的答案?或者更正确?编辑:@AlexBlex 也是对的

标签: php function scope global-variables


【解决方案1】:

除非您另外指定,否则函数/方法参数是按值传递的,这意味着您可以在函数内获得它们的副本。如果您希望函数更改传递给它的变量,则需要通过引用传递。如here所述:

默认情况下,函数参数是按值传递的(这样如果 函数内参数的值被改变,它没有得到 在函数之外更改)。允许一个函数修改它的 参数,它们必须通过引用传递。

要让函数的参数始终通过引用传递,请在前面加上 函数定义中参数名称的与号 (&):

注意文档页面中$array 之前的& 符号,用于对asort()ksort() 等功能进行排序:

bool asort (array &$array [, int $sort_flags = SORT_REGULAR])

bool ksort (array &$array [, int $sort_flags = SORT_REGULAR])

【讨论】:

  • 这是一个清晰的解释,帮助我更好地理解 PHP 的底层机制——谢谢@AlexHowansky。那么在 Javascript 中的 function myFunction(myVariable) 中,myVariable通过引用传递,而在 PHP 中 function My_Function($My_Variable) 中,$My_Variable通过值传递?
  • 我相信 JS 是对象的引用传递和其他一切的值传递。
【解决方案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变量不同。

【讨论】:

  • 太棒了。谢谢@Tweek 的明确解释。我看到这种情况下 javascript 和 PHP 之间的区别在于,因为 PHP 将变量传递给函数 by value (not by reference) ,$myArray = addItemsToMyArray($myArray); 行如果要更新$myArray 的值,必须明确说明
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2018-12-22
  • 2011-07-09
相关资源
最近更新 更多