Изменение глобальной ссылки на переменную внутри функции php - PullRequest
0 голосов
/ 14 октября 2018

У меня проблема с изменением глобальной переменной на другую ссылку внутри функции.

$one = 1;
$two = 2;
$ref = &$one;

change();
echo $ref;

function change(){
    global $ref, $two;
    $ref = &$two;
}

Результатом кода является "1".Я не очень понимаю, почему, я бы догадался, изменив глобальную переменную внутри функции, которая будет постоянной после выхода из области действия функции?

Что было бы хорошим обходным путем (кроме использования массива GLOBALS)?

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

На самом деле это был отличный вопрос.Чтобы ссылки возвращались из функций, используйте & перед именем функции, как показано ниже.

$one = 1;
$two = 2;
$ref = &$one;

$ref = &change();
echo $ref;
$two = 3;
echo $ref;

function &change(){
    global $two;
    return $two;
}

Вывод:

23
0 голосов
/ 14 октября 2018

В PHP ссылка НЕ ​​является указателем.Это что-то вроде псевдонима другой переменной.Я объясню, что происходит с вашим кодом:

$one = 1;
$two = 2;
$ref = &$one;

После трех приведенных выше команд мы имеем:

variables   | $one | $ref | $two |
content     |    1        | 2    |

Как видите, $one и $ref относятся к то же самое содержание, это то, что означает термин reference.Продолжить:

global $ref, $two;

В соответствии с этим документом , указанная выше команда аналогична:

$ref =& $GLOBALS['ref'];
$two =& $GLOBALS['two'];

Итак, мы имеем:

variables   | $one (global) | $ref(global) | $ref (local) | $two (global) | $two (local) |
content     |                    1                        |               2              |

Да, у нас есть 5 переменных!Продолжить:

$ref = &$two;

Это на самом деле:

$ref (local) = &$two (local);

Итак, у нас есть:

variables   | $one (global) | $ref(global) | $ref (local) | $two (global) | $two (local) |
content     |                    1         |                        2                    |

И последняя команда:

echo $ref;

На самом деле это:

echo $ref (global);

И, 1 - правильное значение!

Дополнительно:

change();
echo $two;

function change(){
    global $ref, $two;
    $ref = &$two;
    $ref = 9;
}

Результат этого кода 9;

----- РЕДАКТИРОВАТЬ -----

Я не внимательно прочитал вопрос.Мой ответ на часть The result of the code is "1". I don't really understand why.Ответ Джонатана Ганга - это то, что вы ищете.

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