as
Ключевое слово as в PHP: использование в foreach, псевдонимы пространств имён, разрешение конфликтов трейтов и деструктуризация массивов.
Ключевое слово PHP as
as — небольшое, но универсальное ключевое слово PHP. Оно не является функцией и никогда не встречается само по себе — оно всегда работает как связующий элемент, дающий временное имя чему-либо. Вы встретите его в четырёх различных местах:
- В цикле
foreach— для привязки каждого элемента (и, опционально, его ключа) к переменной. - В выражении
use— чтобы дать импортированному пространству имён, классу или функции короткий псевдоним. - В блоке
useтрейта — для создания псевдонима метода или изменения его области видимости при разрешении конфликтов. - В
list()/ деструктуризации массива внутриforeach(foreach ($rows as [$a, $b])).
Это руководство охватывает каждый вариант использования с запускаемыми примерами, а также распространённые подводные камни.
as в цикле foreach
Это использование встречается чаще всего. Внутри foreach ключевое слово as привязывает текущий элемент к переменной на протяжении тела цикла. Существует две формы:
<?php
// Value only
foreach ($array as $value) {
// $value is the current element
}
// Key and value
foreach ($array as $key => $value) {
// $key is the current key, $value is the current element
}Переменная после as переопределяется на каждой итерации; ей не обязательно существовать заранее.
Перебор значений и пар ключ/значение
<?php
// Indexed array — value only
$names = ["John", "Doe"];
foreach ($names as $name) {
echo $name . "\n";
}
// John
// Doe
// Associative array — key => value
$person = ["name" => "John", "age" => 30];
foreach ($person as $property => $value) {
echo "$property: $value\n";
}
// name: John
// age: 30Поскольку объекты PHP тоже являются итерируемыми, та же форма key => value позволяет перебирать публичные свойства объекта:
<?php
class Person {
public $name = "John";
public $age = 30;
private $secret = "hidden"; // not visible from outside
}
foreach (new Person() as $property => $value) {
echo "$property: $value\n";
}
// name: John
// age: 30Изменение элементов с помощью as &$value
Добавьте & перед переменной цикла, чтобы привязать её по ссылке — тогда изменения будут распространяться обратно в исходный массив:
<?php
$nums = [1, 2, 3];
foreach ($nums as &$n) {
$n *= 2;
}
unset($n); // important — see gotcha below
print_r($nums);
// Array ( [0] => 2 [1] => 4 [2] => 6 )Подводный камень: после цикла
foreach (... as &$value)переменная$valueвсё ещё ссылается на последний элемент. Всегда вызывайтеunset($value)после цикла, иначе последующее присваивание$valueмолча перезапишет этот последний элемент массива.
Деструктуризация с as [...]
Начиная с PHP 7.1 вы можете деструктурировать каждую строку прямо в предложении as, что идеально подходит для массивов пар или строк:
<?php
$pairs = [[1, "one"], [2, "two"]];
foreach ($pairs as [$num, $word]) {
echo "$num => $word\n";
}
// 1 => one
// 2 => twoБолее старый синтаксис list() — foreach ($pairs as list($num, $word)) — делает то же самое. Подробности см. в list().
as для псевдонимов пространств имён и импортов
В выражении use ключевое слово as переименовывает импортируемый символ. Это позволяет избежать длинных полностью квалифицированных имён и устраняет конфликты, когда два импорта имеют одинаковое короткое имя:
<?php
use App\Models\User as UserModel;
use Acme\Auth\User as AuthUser;
// Both "User" classes are now usable without collision:
$a = new UserModel();
$b = new AuthUser();Псевдонимы работают так же для импортируемых функций и констант (use function ... as, use const ... as). Полное описание см. в пространствах имён PHP.
as для разрешения конфликтов трейтов
Когда класс использует два трейта, определяющих метод с одинаковым именем, as позволяет создать псевдоним для одного из них, чтобы оба оставались доступными:
<?php
trait Logger { public function report() { return "log"; } }
trait Notifier { public function report() { return "notify"; } }
class Service {
use Logger, Notifier {
Logger::report insteadof Notifier; // pick Logger's report()
Notifier::report as notify; // keep Notifier's under a new name
}
}
$s = new Service();
echo $s->report() . "\n"; // log
echo $s->notify() . "\n"; // notifyЗдесь as не перебирает ничего — оно просто переименовывает метод. as также может изменить видимость метода, например report as protected reportInternal;.
Когда что использовать
| Контекст | Что делает as | Пример |
|---|---|---|
foreach | привязывает каждый элемент к переменной | foreach ($items as $item) |
use | создаёт псевдоним для импортируемого символа | use Long\Name as Short; |
блок use трейта | создаёт псевдоним / изменяет область видимости метода | Notifier::report as notify; |
| деструктуризация | распаковывает каждую строку | foreach ($rows as [$a, $b]) |
Распространённые ошибки
- Использование
asза пределами описанных выше контекстов.asне является универсальным оператором —$x = $y as $z;вызовет синтаксическую ошибку. - Забыть
unset()после цикла с привязкой по ссылке (см. подводный камень выше). - Ожидание доступа к приватным свойствам при итерации объекта. Доступны только свойства, видимые в текущей области видимости.
Итог
Ключевое слово as всегда привязывает имя: элемент цикла в foreach, псевдоним в импорте use или блоке трейта, либо деструктурированное значение. Знание всех четырёх вариантов использования позволит вам читать и писать идиоматичный PHP без сюрпризов. Для более глубокого изучения обратитесь к циклам PHP, foreach, пространствам имён и трейтам.