Динамическая реализация объекта

Задача
Необходимо создать экземпляр объекта, но до выполнения программы имя его класса неизвестно. Например, требуется выполнить локализацию сайта с помощью создания объекта, относящегося к определенному языку. Однако пока страница не запрошена, неизвестно, какой язык выбрать.

Решение
Используйте переменную в качестве имени класса:

$language = $_REQUEST['language'];
$valid_langs = array('en_US' => 'US English',
'en_GB' => 'British English',
'es_US' => 'US Spanish',
'fr_CA' => 'Canadian French');
if (isset($valid_langs[$language]) && class_exists($language)) {
$lang = new $language;
}

Обсуждение
Иногда имя класса, который требуется реализовать во время выполнения программы, неизвестно, но может быть известна часть его имени.

Например, для создания иерархии псевдоимен классов перед именами классов можно помещать префикс из последовательности символов.

Вот почему мы часто используем строку pc_ для представления книги «PHP. Сборник рецептов» (PHP Cookbook), а PEAR использует Net_ перед именами всех сетевых классов.
Однако в то время как следующий фрагмент допустим в PHP:

$class_name = 'Net_Ping';
$class = new $class_name; // новый Net_Ping
то этот – нет:
$partial_class_name = 'Ping';
$class = new "Net_$partial_class_name"; // новый Net_Ping
Тем не менее следующее верно:
$partial_class_name = 'Ping';
$class_prefix = 'Net_';
$class_name = "$class_prefix$partial_class_name";
$class = new $class_name; // новый Net_Ping

Поэтому нельзя создать экземпляр объекта, если имя его класса определено путем конкатенации переменных на том же шаге.


Однако поскольку разрешается использовать простые имена переменных, то решить проблему помогает предварительное составление имени класса.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Динамическое создание класса
Добавление свойств в базовый объект
Доступ к переопределенным методам
Клонирование объектов
Обнаружение методов и свойств объекта

Вернуться в раздел: PHP / 7. Классы и объекты