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

如何访问内部函数PHP中的变量?,php,function,scope,Php,Function,Scope,如何访问外部功能变量的内部功能中的变量 我想访问内部函数中的$arr变量 <?php function outer() { $arr = array(); function inner($val) { global $arr; if($val > 0) { array_push($arr,$val); } } inner(0); inner(10); i

如何访问
外部
功能变量的
内部
功能中的变量

我想访问内部函数中的
$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();
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() {

    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);

}

php中的函数都是全局函数

如果要访问全局
$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();
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() {

    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);

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

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();

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

第二,如果您需要对函数result(从代码中可以看出)执行某些操作,则使用该值。这就是函数的目的——返回一些值。另一个选项可能是作为参数(如在函数族中),但在正常情况下,您应该避免此类行为。这是一个副作用,通常会使代码的可读性降低


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

只需将
全局
放到外部函数即可

<?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();
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() {

    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);

}

编辑了您的代码。你可以参考一下这个

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
)
这种“内在功能”并没有达到你可能期望的效果。全局(!)函数
internal()
将在调用
outer()
时定义。这也意味着,两次调用
outer()
将导致“无法重新定义inner()”错误

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

使用闭包的代码:


你必须使用
闭包
()为什么这个而不是@fab的答案有这么多的赞成票,尽管他的方法要干净得多?正确的方法+1个用于关闭@非常感谢你抽出时间。我从你的代码中得到了这个错误。看起来codepad运行在一个古老的PHP版本上