Доступ к глобальной переменной PHP в функции


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

<?php
$data='My data';
function menugen(){

    echo "[".$data."]";
}
menugen();
?>

Существует [] в выводе.

 53
Author: Amin Gholibeigian, 2013-03-28

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

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

 102
Author: Matteo Tassinari, 2017-03-15 10:52:44

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

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

Или

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

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

 9
Author: jcbwlkr, 2013-03-28 16:42:03

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

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

$data = 'My data';

function menugen($data)
{
    echo $data;
}

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

class MyClass
{
    private $data = "";

    function menugen()
    {
        echo this->data;
    }

}

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

 6
Author: webnoob, 2013-03-28 16:40:20

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

<?php

$data = 'My data';

$menugen = function() use ($data) {

    echo "[".$data."]";
};

$menugen();
 4
Author: donvercety, 2016-02-05 20:32:47

Вам нужно передать переменную в функцию:

$data = 'My data';

function menugen($data)
{
    echo $data;
}
 0
Author: Major Productions, 2013-03-28 16:38:29

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

<?php
define("GREETING", "Welcome to W3Schools.com!");

function myTest() {
    echo GREETING;
}

myTest();
?>

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

 -1
Author: Mohamad Hamouday, 2017-06-22 08:40:35