Согласно большинству правил области программирования языков программирования, я могу обращаться к переменным, которые определены вне функций внутри них, но почему этот код не работает?
<?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(); ?>