У PHP функція не бачить змінних ззовні - на відміну від JavaScript, де внутрішня функція бачить змінні зовнішньої.
$rate = 1.2;
function withTax(int $price): float
{
return $price * $rate; // Warning: Undefined variable $rate
}
Як передати значення у функцію:
- Параметром - правильний спосіб:
withTax(100, $rate). global $rate;чи$GLOBALS['rate']- доступ до глобальної змінної. Працює, але робить функцію залежною від прихованого глобального стану: її важко тестувати й переносити.- Замикання з
use- захоплює значення змінної в момент створення:
$withTax = function (int $price) use ($rate): float {
return $price * $rate;
};
- Стрілкова функція захоплює зовнішні змінні автоматично (за значенням):
$withTax = fn (int $price): float => $price * $rate;
Статичні змінні зберігають значення між викликами функції:
function counter(): int
{
static $count = 0;
return ++$count;
}
Корисно для мемоізації, але це теж прихований стан, що живе весь процес.
Блоки не створюють області видимості: змінна, оголошена в if чи foreach, видна після нього до кінця функції - наприклад, $item після foreach ($items as $item) дорівнює останньому елементу.
Методи класу бачать лише свої параметри й $this, тож стан об'єкта - явна альтернатива глобальним змінним.