Доступ к глобальной переменной PHP в функции
Согласно правилам области действия большинства языков программирования, я могу получить доступ к переменным, которые определены вне функций внутри них, но почему этот код не работает?
<?php
$data='My data';
function menugen(){
echo "[".$data."]";
}
menugen();
?>
Существует [] в выводе.
6 answers
Это не работает, потому что вы должны объявить, к каким глобальным переменным вы будете обращаться:
$data='My data';
function menugen(){
global $data; // <-- add this line
echo "[".$data."]";
}
menugen();
В противном случае вы можете получить к нему доступ как $GLOBALS['data']
, см. http://php.net/manual/en/language.variables.scope.php
Даже если немного ОТ, я бы посоветовал вам вообще избегать использования глобальных значений и предпочитать передачу в качестве параметров.
Вы можете выполнить одно из следующих действий:
<?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;
}
}
Редактировать: Смотрите Ответ @Matteotassinari, а также вы можете пометить его как глобальный, чтобы получить к нему доступ, но глобальные переменные, как правило, не требуются, поэтому было бы разумно пересмотреть ваше кодирование.
Другой способ сделать это:
<?php
$data = 'My data';
$menugen = function() use ($data) {
echo "[".$data."]";
};
$menugen();
Вам нужно передать переменную в функцию:
$data = 'My data';
function menugen($data)
{
echo $data;
}
Если вы хотите, вы можете использовать функцию "определить", но эта функция создает константы, которые нельзя изменить после определения.
<?php
define("GREETING", "Welcome to W3Schools.com!");
function myTest() {
echo GREETING;
}
myTest();
?>