Функция 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;