Переменные названия свойств объектов в 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()}; // выведет 'Иванов'
?>