2017-06-30 3 views
4

J'essaie de créer un chemin à partir d'un tableau d'éléments parent-enfant.Pourquoi ne puis-je pas utiliser 'use' dans des fonctions non anonymes?

L'idée était d'écrire une fonction récursive, qui remplit un tableau avec tous les éléments que le chemin contient dans l'ordre.

Mon problème est avec fermeture en PHP:

Pour ma fonction récursive au travail, je devais définir plusieurs variables dans la portée globale.

Voici comment il ressemble:

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

J'ai essayé d'utiliser le mot-clé 'utilisation' au lieu de GLOBALS ainsi:

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

Mais cela me donne erreur de syntaxe:

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

Qu'est-ce que je fais mal ici?

Pourquoi est-ce que $breadcrumbs doit être global en premier lieu afin que la fonction puisse l'utiliser?

+2

la fonction est locale à lui-même, il n'a pas accès à des variables en dehors de celui-ci, à moins que vous choisissez d'ajouter un paramètre à lui. C'est pourquoi il n'a pas accès à '$ breadcrumbs '- parce qu'il est hors de portée – ThisGuyHasTwoThumbs

+0

Pourquoi ne passez-vous pas les variables dans la fonction? – AbraCadaver

Répondre

0

Si vos variables sont toutes utilisées uniquement dans cette classe, vous pouvez utiliser le mot clé $ this.

Exemple:

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

Si elles sont des variables vraiment globales alors vous devez les utiliser comme global. Ou créez une fonction après cela qui met à jour vos variables globales avec vos variables de classe (que vous avez mises à jour avec le mot-clé $ this.)

0

Avec les fonctions anonymes, vous n'importez pas de variables de la portée globale, vous importez des variables de la portée parentale.

Une grande distinction serait:

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

Une fonction nommée n'a pas la même portée « parent » que les fermetures.

Inheriting variables from the parent scope is not the same as using global variables. Global variables exist in the global scope, which is the same no matter what function is executing. The parent scope of a closure is the function in which the closure was declared

Voir l'exemple # 4 ici: http://php.net/manual/en/functions.anonymous.php