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

标签 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”关键字而不是全局变量:

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 首先必须是全局的,这样函数才能使用它?

最佳答案

如果你的变量全部只用在这个类中,可以使用$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 关键字更新。)

关于php - 为什么我不能在非匿名函数中使用 'use'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44850405/

相关文章:

c++ - 查找通过 4x4 网格的所有路径

c++ - 为什么此代码工作/失败取决于范围关闭创建于?

Javascript 对象/闭包

php - JSON_BIGINT_AS_STRING 向后移植

recursion - 使用递归和模式匹配从列表中删除元素

PHP 替换 HTML 标签中的 CSS

java - 我的程序给了我一个 StackOverflowError

javascript - 在 JavaScript 中使用 eval 运行一组闭包

php - Symfony 3 - 你请求了一个不存在的服务让我发疯

javascript - 使用带进度指示器的 AJAX 上传图片