为什么我不能在非匿名函数中使用'use'?

时间:2017-06-30 15:46:55

标签: php recursion closures

我正在尝试从父子元素数组创建路径。

这个想法是写一个递归函数,它用一个数组填充路径包含的所有元素。

我的问题是PHP中的闭包:

为了让我的递归函数起作用,我必须在全局范围内定义几个变量。

这就是它的样子:

global $breadcrumbs;
$breadcrumbs = array();
function buildBreadcrumbs($elements, $parentID){
    global $siteroot;
    global $breadcrumbs;
    global $navigation;
    if($siteroot['id'] === $parentID){
        $nav = array_values($navigation);
        array_unshift($breadcrumbs, array('label' => 'Start', 'id' => $nav[0]['id']));
    } else {
        foreach ($elements as $element) {
            if ($element['id'] === $parentID) {
                array_unshift($breadcrumbs, array('label' => $element['navlabel'], 'id' => $element['id']));
                buildBreadcrumbs($elements, $element['parent'][0]);
            }
        }
    }
}

我尝试以这种方式使用'use'关键字而不是globals:

function buildBreadcrumbs($elements, $parentID) use($siteroot, $breadcrumbs, $navigation){
        if($siteroot['id'] === $parentID){
            $nav = array_values($navigation);
            array_unshift($breadcrumbs, array('label' => 'Start', 'id' => $nav[0]['id']));
        } else {
            foreach ($elements as $element) {
                if ($element['id'] === $parentID) {
                    array_unshift($breadcrumbs, array('label' => $element['navlabel'], 'id' => $element['id']));
                    buildBreadcrumbs($elements, $element['parent'][0]);
                }
            }
        }
    }

但是这给了我语法错误:

PHP Parse error: syntax error, unexpected T_USE, expecting '{'

我在这里做错了什么?

为什么$breadcrumbs必须首先是全局的,所以函数可以使用它?

2 个答案:

答案 0 :(得分:0)

如果您的变量都只在此类中使用,则可以使用$ this关键字。

示例:

private $breadcrumbs = array();
private $siteroot;
private $navigation;

function buildBreadcrumbs($elements, $parentID){
    if($this->siteroot['id'] === $parentID){
        $nav = array_values($this->navigation);
        array_unshift($this->breadcrumbs, array('label' => 'Start', 'id' => $nav[0]['id']));
    } else {
        foreach ($elements as $element) {
            if ($element['id'] === $parentID) {
                array_unshift($this->breadcrumbs, array('label' => $element['navlabel'], 'id' => $element['id']));
                buildBreadcrumbs($elements, $element['parent'][0]);
            }
        }
    }
}

如果它们是真正的全局变量,那么你必须将它们用作全局变量。或者在此之后创建一个函数,用您的类变量(使用$ this关键字更新)更新全局变量。

答案 1 :(得分:0)

使用匿名函数,您无法从全局范围导入变量,而是从父范围导入变量。

一个很大的区别是:

$global = 123;
function parent() {
   $parent = 123;
   $closure = function() use ($parent, $global) {
      // $global won't exist, but $parent will.
   }
}

命名函数没有相同的" parent"范围作为闭包。

  

从父作用域继承变量与使用不同   全局变量。全局变量存在于全局范围内,即   无论执行什么功能都是一样的。 a的父范围   闭包是声明闭包的函数

请参见示例#4:http://php.net/manual/en/functions.anonymous.php