PHP доступ к глобальной переменной в функции
Согласно большинству правил области языков программирования, я могу получить доступ к переменным, которые определены вне функций внутри них, но почему этот код не работает?
<?php
$data='My data';
function menugen(){
echo "[".$data."]";
}
menugen();
?>
здесь [] в выход.
6 ответов:
это не работает, потому что вы есть чтобы объявить, к каким глобальным переменным вы будете обращаться:
$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, я бы предложил вам вообще избегать использования глобалов и предпочитать передачу в качестве параметров.
Вы можете выполнить одно из следующих действий:
<?php $data='My data'; function menugen(){ global $data; echo "[".$data."]"; } menugen();или
<?php $data='My data'; function menugen(){ echo "[".$GLOBALS['data']."]"; } menugen();как говорится, чрезмерное использование глобалов может привести к некоторому плохому коду. Обычно лучше сдать то, что вам нужно. Например, вместо ссылки на объект глобальной базы данных вы должны передать дескриптор в базу данных и действовать в соответствии с этим. Это называется инъекцией зависимостей. Это делает вашу жизнь намного проще, когда вы внедряете автоматизированное тестирование (которое вы должны).
это вопрос масштаба. Короче говоря, глобальных переменных следует избегать так:
вы должны передать его в качестве параметра:
$data = 'My data'; function menugen($data) { echo $data; }или иметь его в классе и получить к нему доступ
class MyClass { private $data = ""; function menugen() { echo this->data; } }Edit: см. ответ @MatteoTassinari, а также вы можете пометить его как глобальный, чтобы получить к нему доступ, но глобальные vars, как правило, не требуются, поэтому было бы разумно переосмыслить ваше кодирование.
другой способ сделать это:
<?php $data = 'My data'; $menugen = function() use ($data) { echo "[".$data."]"; }; $menugen();
Если вы хотите, вы можете использовать функцию "define", но эта функция создает константы, которые не могут быть изменены после определения.
<?php define("GREETING", "Welcome to W3Schools.com!"); function myTest() { echo GREETING; } myTest(); ?>
Comments