Selon la plupart des règles de portée des langages de programmation, je peux accéder aux variables définies en dehors de leurs fonctions, mais pourquoi ce code ne fonctionne-t-il pas?
<?php
$data = 'My data';
function menugen(){
echo "[".$data."]";
}
menugen();
?>
Il y a []
en sortie.
Cela ne fonctionne pas parce que vous devez pour déclarer les variables globales auxquelles vous allez accéder:
$data = 'My data';
function menugen() {
global $data; // <-- add this line
echo "[".$data."]";
}
menugen();
sinon vous pouvez y accéder en tant que $GLOBALS['data']
, voir http://php.net/manual/fr/language.variables.scope.php
Même si un peu d'OT, je vous suggère d'éviter d'utiliser des globaux et préférez passer en tant que paramètres.
Vous pouvez effectuer l’une des opérations suivantes:
<?php
$data='My data';
function menugen(){
global $data;
echo "[".$data."]";
}
menugen();
Ou
<?php
$data='My data';
function menugen(){
echo "[".$GLOBALS['data']."]";
}
menugen();
Cela étant dit, la surutilisation de globals peut conduire à un code médiocre. Il est généralement préférable de transmettre ce dont vous avez besoin. Par exemple, au lieu de référencer un objet de base de données global, vous devez transmettre un descripteur à la base de données et agir en conséquence. Ceci s'appelle l'injection de dépendance. Votre vie est beaucoup plus facile lorsque vous implémentez des tests automatisés (ce que vous devriez faire).
C'est une question de portée. En bref, il faut éviter les variables globales SO:
Vous devez soit le passer en paramètre:
$data = 'My data';
function menugen($data)
{
echo $data;
}
OU l'avoir dans une classe et y accéder
class MyClass
{
private $data = "";
function menugen()
{
echo this->data;
}
}
Éditer: voir la réponse de @MatteoTassinari de même que vous pouvez le marquer comme global pour y accéder, mais les vars globaux ne sont généralement pas nécessaires; il serait donc sage de repenser votre codage.
Une autre façon de le faire:
<?php
$data = 'My data';
$menugen = function() use ($data) {
echo "[".$data."]";
};
$menugen();
Si vous le souhaitez, vous pouvez utiliser la fonction "define" mais cette fonction crée des constantes qui ne peuvent pas être modifiées une fois définies.
<?php
define("GREETING", "Welcome to W3Schools.com!");
function myTest() {
echo GREETING;
}
myTest();
?>
Pendant de nombreuses années, j'ai toujours utilisé ce format:
<?php
$data = "Hello";
function sayHello(){
echo $GLOBALS["data"];
}
sayHello();
?>
Je le trouve simple et facile à suivre. Le $ GLOBAL est le moyen par lequel PHP vous permet de référencer une variable globale. Si vous avez utilisé des éléments tels que $ _SERVER, $ _POST, etc., vous devez référencer une variable globale sans le savoir.
Vous devez passer la variable dans la fonction:
$data = 'My data';
function menugen($data)
{
echo $data;
}