web-dev-qa-db-fra.com

PHP function use variable from outside

function parts($part) { 
    $structure = 'http://' . $site_url . 'content/'; 
    echo($tructure . $part . '.php'); 
}

Cette fonction utilise une variable $site_url qui a été défini en haut de cette page, mais cette variable n'est pas transmise à la fonction.

Comment le faire revenir dans la fonction?

41
Robin Knight

Ajouter un deuxième paramètre

Vous devez passer un paramètre supplémentaire à votre fonction:

function parts($site_url, $part) { 
    $structure = 'http://' . $site_url . 'content/'; 
    echo $structure . $part . '.php'; 
}

En cas de fermeture

Si vous préférez utiliser des fermetures, vous pouvez importer une variable dans la portée actuelle (le mot clé use):

$parts = function($part) use ($site_url) { 
    $structure = 'http://' . $site_url . 'content/'; 
    echo $structure . $part . '.php'; 
};

global - une mauvaise pratique

Ce message est fréquemment lu, donc quelque chose doit être clarifié à propos de global. Son utilisation est considérée comme une mauvaise pratique (voir this et this ).

Par souci d'exhaustivité, voici la solution utilisant global:

function parts($part) { 
    global $site_url;
    $structure = 'http://' . $site_url . 'content/'; 
    echo($structure . $part . '.php'); 
}

Cela fonctionne parce que vous devez dire à l'interpréteur que vous voulez utiliser une variable globale, maintenant c'est pense c'est une variable locale (dans votre fonction).

Lecture suggérée:

94
Zbigniew

Vous pouvez également importer des variables de la portée externe en utilisant des fermetures avec le mot clé use.

$myVar = "foo";
$myFunction = function($arg1, $arg2) use ($myVar)
{
 return $arg1 . $myVar . $arg2;
};
39
Joe Green

N'oubliez pas que vous pouvez également transmettre ces variables use par référence.

Les cas d'utilisation sont lorsque vous devez modifier la variable use 'd depuis l'intérieur de votre rappel (par exemple, produire le nouveau tableau d'objets différents à partir d'un tableau source d'objets).

$sourcearray = [ (object) ['a' => 1], (object) ['a' => 2]];
$newarray = [];
array_walk($sourcearray, function ($item) use (&$newarray) {
    $newarray[] = (object) ['times2' => $item->a * 2];
});
var_dump($newarray);

À présent $newarray comprendra (pseudocode ici par souci de concision)[{times2:2},{times2:4}].

Au contraire, en utilisant $newarray sans & le modificateur rendrait l'extérieur $newarray variable être accessible en lecture seule depuis la portée de fermeture. Mais $newarray dans le périmètre de fermeture serait une variable nouvellement créée complètement différente vivant uniquement dans le périmètre de fermeture.

Bien que les noms des deux variables soient les mêmes, il s'agirait de deux variables différentes. L'extérieur $newarray la variable comprendrait [] dans ce cas une fois le code terminé.

5
bob-12345

Mettez simplement la fonction en utilisant le mot-clé GLOBAL:

 global $site_url;
0
HBv6