W3docs

as

Ключевое слово as в PHP: использование в foreach, псевдонимы пространств имён, разрешение конфликтов трейтов и деструктуризация массивов.

Ключевое слово PHP as

as — небольшое, но универсальное ключевое слово PHP. Оно не является функцией и никогда не встречается само по себе — оно всегда работает как связующий элемент, дающий временное имя чему-либо. Вы встретите его в четырёх различных местах:

  1. В цикле foreach — для привязки каждого элемента (и, опционально, его ключа) к переменной.
  2. В выражении use — чтобы дать импортированному пространству имён, классу или функции короткий псевдоним.
  3. В блоке use трейта — для создания псевдонима метода или изменения его области видимости при разрешении конфликтов.
  4. В 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, пространствам имён и трейтам.

Практика

Практика
Что делает ключевое слово 'as' в PHP?
Что делает ключевое слово 'as' в PHP?
Was this page helpful?