# Переменные названия свойств объектов в PHP

Пусть у нас есть вот такой класс `User`:

`<?php class User { public $name; public $age; public function __construct($name, $age) { $this->name = $name; $this->age = $age; } } $user = new User('john', 21); echo $user->name; // выведет 'john' ?>`

На примере этого класса мы сейчас разберем то, что названия свойств можно хранить в переменной.

К примеру, пусть у нас есть переменная `$prop`, в которой лежит строка `'name'`. Тогда обращение `$user->$prop` по сути эквивалентно обращению `$user->name`. Такое хитрое обращения к свойствам класса используется редко, но иногда бывает полезно.

Посмотрим на примере:

`<?php $user = new User('john', 21); $prop = 'name'; echo $user->$prop; // выведет 'john' ?>`

Сделайте класс `City`, в котором будут следующие свойства - `name`, `foundation` (дата основания), `population` (население). Создайте объект этого класса.

Пусть дана переменная `$props`, в которой хранится массив названий свойств класса `City`. Переберите этот массив циклом `foreach` и выведите на экран значения соответствующих свойств.

## Массив свойств

Пусть теперь дан вот такой класс `User`:

`<?php class User { public $surname; // фамилия public $name; // имя public $patronymic; // отчество public function __construct($surname, $name, $patronymic) { $this->surname = $surname; $this->name = $name; $this->patronymic = $patronymic; } } ?>`

И пусть дан массив свойств

`<?php $props = ['surname', 'name', 'patronymic']; ?>`

Попробуем теперь вывести значение свойства, которое хранится в нулевом элементе массива, то есть в `$props[0]`. Просто так, однако, это не будет работать:

`<?php $user = new User('Иванов', 'Иван', 'Иванович'); $props = ['surname', 'name', 'patronymic']; echo $user->$props[0]; // так работать не будет ?>`

Для того, чтобы такое сложное имя свойства заработало, его нужно взять в фигурные скобки, вот так:

`<?php $user = new User('Иванов', 'Иван', 'Иванович'); $props = ['surname', 'name', 'patronymic']; echo $user->{$props[0]}; // выведет 'Иванов' ?>`

Скопируйте мой код класса `User` и массив `$props`. В моем примере на экран выводится фамилия юзера. Выведите еще и имя, и отчество.

## Ассоциативный массив

Массив, кстати, может быть и ассоциативным:

`<?php $user = new User('Иванов', 'Иван', 'Иванович'); $props = ['prop1' => 'surname', 'prop2' => 'name', 'prop3' => 'patronymic']; echo $user->{$props['prop1']}; // выведет 'Иванов' ?>`

## Имя свойства из функции

Имя свойства также может быть из функции:

`<?php function getProp() { return 'surname'; } $user = new User('Иванов', 'Иван', 'Иванович'); echo $user->{getProp()}; // выведет 'Иванов' ?>`

## Имя свойства из свойства другого объекта

Имя свойства может быть даже свойством другого объекта.

Проиллюстрируем кодом. Пусть для примера дан объект `Prop`, который в свойстве `value` будет содержать название свойства объекта `User`:

`<?php class Prop { public $value; public function __construct($value) { $this->value = $value; } } ?>`

Давайте выведем фамилию юзера с помощью объекта `Prop`:

`<?php $user = new User('Иванов', 'Иван', 'Иванович'); $prop = new Prop('surname'); // будем выводить значение свойства surname echo $user->{$prop->value}; // выведет 'Иванов' ?>`

## Имя свойства из метода другого объекта

Имя свойства также может браться из метода другого объекта:

`<?php class Prop { private $value; public function __construct($value) { $this->value = $value; } public function getValue() { return $this->value; } } ?>`

Давайте выведем фамилию юзера:

`<?php $user = new User('Иванов', 'Иван', 'Иванович'); $prop = new Prop('surname'); // будем выводить значение свойства surname echo $user->{$prop->getValue()}; // выведет 'Иванов' ?>`
←→
↑