【问题标题】:How to access the Variable in inner function PHP?如何访问内部函数 PHP 中的变量?
【发布时间】:2014-04-08 17:35:49
【问题描述】:

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

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

【问题讨论】:

标签: php function scope


【解决方案1】:

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

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
)

【讨论】:

  • 为什么这个而不是@fab 的答案有这么多的赞成票,尽管他的方法更干净?
【解决方案2】:

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

正如@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 用于闭包!
  • @fab 感谢您的宝贵时间。我从你的代码中得到了这个错误。 codepad.org/KLb20XSq
  • 看起来键盘在一个古老的 PHP 版本
【解决方案3】:

只需将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.

【讨论】:

    【解决方案4】:

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

    其次,如果你需要对函数结果做一些事情(从你的代码来看)-return 那个值。这就是函数的意图——返回一些值。另一个选项可能是 using reference 作为参数(就像在 sort() 函数系列中一样) - 但在正常情况下,您应该避免这种行为。这是副作用,这通常会降低代码的可读性。

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-17
        • 2015-04-29
        • 1970-01-01
        • 2017-02-02
        • 1970-01-01
        • 2017-06-01
        相关资源
        最近更新 更多