Пожалуйста, рассмотрите этот код, чтобы понять, что происходит:
<?php // bar.php
$one = 1;
$two = 2;
и
<?php // foo.php
$someVar = 'var';
function foo()
{
$someOtherVar = 'otherVar';
include 'bar.php';
// get defined vars in current scope
print_r(array_keys(get_defined_vars()));
}
foo();
// get defined vars in current scope
print_r(array_keys(get_defined_vars()));
выведет что-то вроде
Array
(
[0] => someOtherVar
[1] => one
[2] => two
)
Array
(
[0] => GLOBALS
[1] => _ENV
[2] => HTTP_ENV_VARS
[3] => argv
[4] => argc
[5] => _POST
[6] => HTTP_POST_VARS
[7] => _GET
[8] => HTTP_GET_VARS
[9] => _COOKIE
[10] => HTTP_COOKIE_VARS
[11] => _SERVER
[12] => HTTP_SERVER_VARS
[13] => _FILES
[14] => HTTP_POST_FILES
[15] => _REQUEST
[16] => someVar
)
Как видите, внутри области действия функции foo () у вас есть доступ к переменным, включенным в bar.php, но как только функция будет выполнена, и поток управления вернется в глобальную область, например, после вызова foo () переменные недоступны, поскольку они не были экспортированы за пределы области действия функции. Если вы включили bar.php вне области действия функции, например
include 'bar.php'; // instead of foo()
print_r(array_keys(get_defined_vars()));
вы получите
Array
(
...
[16] => someVar
[17] => one
[18] => two
)
Помещение большого количества переменных в глобальную область видимости несет опасность загрязнения глобальной области действия и риска столкновения имен переменных. То есть у одного файла включения может быть переменная $ row, а у другого тоже может быть переменная, и они перезаписывают друг друга. Лучше объединить вещи, которые принадлежат вместе, в классы / объекты и / или заменить глобальную область видимости с помощью шаблона реестра .
Хотя я очень одобряю ООП-подход, вы все равно можете сделать это с вашей функцией на месте. Просто верните необходимую переменную из вызова функции.
function foo()
{
$someOtherVar = 'otherVar';
include 'bar.php';
// this is why I do not like this approach $one pops out all of a sudden.
// I can deduct, it has to be in bar.php, but if you do that often, your
// code will be very hard to read.
return $one;
}
$user = foo(); // will contain $one then
// get defined vars in current scope
print_r(array_keys(get_defined_vars()));
// gives
Array
(
...
[16] => someVar
[17] => user
)
Конечно, если вы хотите, чтобы все переменные были объявлены во время вызова foo (), вам нужно было бы поместить их в массив, поскольку одновременно может быть возвращено только одно значение. Но это в основном, когда вы замечаете, что это становится неуклюжим, и переключение на занятия кажется естественным (ну, по крайней мере, для меня).