Переменные названия свойств

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

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

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

К примеру, пусть у нас есть переменная $prop, в которой лежит строка 'name'.

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

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

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

Сделайте класс 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].

На самом деле, если просто попытаться сделать $user->$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()}; // выведет 'Иванов' ?>