Глобальная переменная доступа PHP в функции

Согласно большинству правил области программирования языков программирования, я могу обращаться к переменным, которые определены вне функций внутри них, но почему этот код не работает?

<?php $data='My data'; function menugen(){ echo "[".$data."]"; } menugen(); ?> 

На выходе есть [] .

Он не работает, потому что вы должны объявлять, какие глобальные переменные вы будете получать:

 $data='My data'; function menugen(){ global $data; // <-- add this line echo "[".$data."]"; } menugen(); 

в противном случае вы можете получить к нему доступ как $GLOBALS['data'] , см. http://php.net/manual/en/language.variables.scope.php

Даже если немного OT, я бы посоветовал вам вообще избегать использования глобальных переменных и предпочитать передавать в качестве параметров.

Это вопрос масштаба. Короче говоря, глобальных переменных следует избегать. SO:

Вам либо нужно передать его как параметр:

 $data = 'My data'; function menugen($data) { echo $data; } 

ИЛИ иметь его в классе и получить доступ к нему

 class MyClass { private $data = ""; function menugen() { echo this->data; } } 

Изменить: см. Ответ @MatteoTassinari, а также вы можете пометить его как глобальный для доступа к нему, но глобальные вары обычно не требуются, поэтому было бы разумно переосмыслить вашу кодировку.

Вы можете выполнить одно из следующих действий:

 <?php $data='My data'; function menugen(){ global $data; echo "[".$data."]"; } menugen(); 

Или

 <?php $data='My data'; function menugen(){ echo "[".$GLOBALS['data']."]"; } menugen(); 

При этом чрезмерное использование глобальных переменных может привести к некорректному коду. Обычно лучше проходить то, что вам нужно. Например, вместо ссылки на объект глобальной базы данных вы должны передать дескриптор в базу данных и действовать по этому поводу. Это называется инъекцией зависимостей. Это облегчает вашу жизнь при автоматическом тестировании (что вам нужно).

Другой способ сделать это:

 <?php $data = 'My data'; $menugen = function() use ($data) { echo "[".$data."]"; }; $menugen(); 

Если вы хотите, вы можете использовать функцию «define», но эта функция создает константы, которые нельзя изменить после их определения.

 <?php define("GREETING", "Welcome to W3Schools.com!"); function myTest() { echo GREETING; } myTest(); ?> 

http://www.w3schools.com/php/php_constants.asp