我正在尝试从父子元素数组创建路径。
这个想法是写一个递归函数,它用一个数组填充路径包含的所有元素。
我的问题是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
必须首先是全局的,所以函数可以使用它?
答案 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的父范围 闭包是声明闭包的函数