Функция PHP использует переменную извне
function parts($part) {
$structure = 'http://' . $site_url . 'content/';
echo($tructure . $part . '.php');
}
Эта функция использует переменную $site_url
которая была определена в верхней части этой страницы, но эта переменная не передается в функцию.
Как мы можем вернуть его в функцию?
Ответы
Ответ 1
Добавить второй параметр
Вам нужно передать дополнительный параметр вашей функции:
function parts($site_url, $part) {
$structure = 'http://' . $site_url . 'content/';
echo $structure . $part . '.php';
}
В случае закрытия
Если вы предпочитаете использовать замыкания, вы можете импортировать переменную в текущую область (ключевое слово use
):
$parts = function($part) use ($site_url) {
$structure = 'http://' . $site_url . 'content/';
echo $structure . $part . '.php';
};
global
- плохая практика
Этот пост часто читают, поэтому нужно кое-что прояснить по поводу global
. Использование это считается плохой практикой (обратитесь к этому и этому).
Для полноты картины вот решение с использованием global
:
function parts($part) {
global $site_url;
$structure = 'http://' . $site_url . 'content/';
echo($structure . $part . '.php');
}
Это работает, потому что вы должны сообщить интерпретатору, что хотите использовать глобальную переменную, теперь он считает ее локальной переменной (в вашей функции).
Предлагаемое чтение:
Ответ 2
Кроме того, вы можете переносить переменные из внешней области, используя закрытие с ключевым словом use
.
$myVar = "foo";
$myFunction = function($arg1, $arg2) use ($myVar)
{
return $arg1 . $myVar . $arg2;
};
Ответ 3
Не забывайте, что вы также можете передать эти переменные use
по ссылке.
Варианты использования - это когда вам нужно изменить переменную use
d изнутри вашего обратного вызова (например, создать новый массив различных объектов из некоторого исходного массива объектов).
$sourcearray = [ (object) ['a' => 1], (object) ['a' => 2]];
$newarray = [];
array_walk($sourcearray, function ($item) use (&$newarray) {
$newarray[] = (object) ['times2' => $item->a * 2];
});
var_dump($newarray);
Теперь $newarray
будет содержать (псевдокод здесь для краткости) [{times2:2},{times2:4}]
.
Напротив, использование $newarray
без модификатора &
сделает внешнюю переменную $newarray
доступной только для чтения изнутри области закрытия. Но $newarray
пределах замыкания будет совершенно новой вновь создаваемой переменной, живущей только внутри замыкания.
Несмотря на то, что имена обеих переменных одинаковы, это будут две разные переменные. Внешняя переменная $newarray
будет содержать []
в этом случае после завершения кода.
Ответ 4
Просто введите функцию с помощью ключевого слова GLOBAL:
global $site_url;