如何在内部函数PHP中访问变量?

时间:2014-03-06 08:00:09

标签: php function scope

如何访问inner函数变量的outer函数中的变量?

我想在内部函数中访问$arr变量。

<?php

function outer() {

    $arr = array();

    function inner($val) {

        global $arr;

        if($val > 0) {
            array_push($arr,$val);
        }
    }

    inner(0);
    inner(10);
    inner(20);

    print_r($arr);

}

outer();

codepad link

5 个答案:

答案 0 :(得分:8)

这种“内在功能”并不能达到您所期望的效果。调用inner()时将定义全局(!)函数outer()。这也意味着,调用outer()两次会导致“无法重新定义inner()”错误。

正如@hindmost指出的那样,你需要闭包,这些函数可以访问当前作用域的变量。此外,虽然普通函数不能具有局部范围,但闭包可以,因为它们存储为变量。

您的代码与闭包:

function outer() {

    $arr = array();

    $inner = function($val) use (&$arr) {
        if($val > 0) {
            array_push($arr,$val);
        }
    }

    $inner(0);
    $inner(10);
    $inner(20);

    print_r($arr);

}

outer();

答案 1 :(得分:4)

编辑了您的代码。你可能想参考这个

function outer() {

    $arr = array();

    function inner(&$arr,$val) { // pass array by reference
        if($val > 0) {
            array_push($arr,$val);
        }
    }

    inner($arr,0);
    inner($arr,10);
    inner($arr,20);

    print_r($arr);

}

outer();

您可以按值传递arr,但无法打印此

Array
(
    [0] => 10
    [1] => 20
)

答案 2 :(得分:1)

首先,不要在函数内部使用函数。为什么?因为这样你在第二次触发外部函数时会遇到致命错误(这是因为第二次运行会再次调用内部函数声明)。

其次,如果你需要对函数结果做一些事情(因为它代表你的代码) - return那个值。这就是要做的功能 - 返回一些价值。另一个选项可能是using reference作为参数(如sort()函数系列中的那样) - 但在正常情况下,您应该避免此类行为。这是副作用,这使得代码通常不易读取。

第三,不要使用global变量。因为这会将您的函数绑定到您的上下文,使您的代码在更改全局上下文方面完全不可预测 - 并且也无法扩展到其他上下文。

答案 3 :(得分:0)

php中的函数都是全局函数。

如果您想访问全局$arr,那么您必须在outer函数中将其设为全局。

function outer() {

    global $arr;
    $arr = array();

    function inner($val) {

        global $arr;

        if($val > 0) {
            array_push($arr,$val);
        }
    }

    inner(0);
    inner(10);
    inner(20);

    print_r($arr);

}

outer();

有一种更好的方法可以做到这一点。

function outer() {

    $arr = array();

    $inner = function ($val) use (&$arr) {
        if($val > 0) {
           array_push($arr, $val);
        }
    };

    $inner(0);
    $inner(10);
    $inner(20);

    print_r($arr);

}

outer();

答案 4 :(得分:0)

只需将global放入外部函数。

function outer() {

    global $arr;
    $arr = array();

    function inner($val) {

        global $arr;

        if($val > 0) {
            array_push($arr,$val);
        }
    }

    inner(0);
    inner(10);
    inner(20);

    print_r($arr);

}

Updated codepad.