PHP: как создать объект по имени класса
2 повідомлення
#15 років тому
Суть проблемы.Есть некий класс. Имя которого задается в строковой переменной, а сам класс инклайдиться.
Как создать объект этого класса.
Пример
Есть
MyClass.php
=========
class MyClass {
...
}
==========
Код
<?
$class = "MyClass";
include $class . "php";
и теперь хочу получить объект. Как?
450 повідомлень
450 повідомлень
206 повідомлень
#15 років тому
$className = 'MyClass';1)
$obj = new $className();
2)
$class = new ReflectionClass($className);
$obj = $class->newInstance();
3)
$class = new ReflectionClass($className);
$obj = call_user_func_array(array(&$class, 'newInstance'

где-то на php.net есть сравнеие быстродействия. 2-й способ быстрее.
205 повідомлень
#15 років тому
$class = new ReflectionClass($Name);
if ($class->getConstructor() === NULL)
{
$object = new $Name();
}
else
{
$object = $class->newInstanceArgs(array('arg1'=>1, 'arg2'=>2));
}
единственный верный вариант

49 повідомлень
#15 років тому
e1it3: всего то достаточно объявлять в каждом классе конструктор по умолчанию, по-моему, это лучше чем использовать подобные конструкции.Цитата:
1) 2) 3)
Используйте первый способ как самый читабельный.
Вариант с отражением удобен когда перед созданием нужно проверить реализует ли класс требуемый интерфейс:
$command = null;
// .....
$class = 'OtherClass';
$commandClass = new ReflectionClass($class);
if ($commandClass->isSubClassOf('MyClass')) {
$command = $commandClass->newInstance();
}
Сравнивать скорости - пустая трата времени. Не могу представить ни одного приложения где создание объекта одним из предложенных способов станет узким местом.
И самый прозрачный вариант - использовать автозагрузку:
$obj = new MyObject();
function __autoload($className) {
require_once $className.'.php';
}
21 повідомлення
#15 років тому
Цитата ("Vlad_06"):$className = 'MyClass';
1)
$obj = new $className();
Так должно работать. Не мудрите с отражениями.
2 повідомлення
#15 років тому
Спасибо за ответы.Предполагал что должно работать первым методом, ведь интерпретатор.
Попробовал в лоб
new 'MyClass'()получил ошибку и от идеи отказался
А так (через переменную) действительно работает:
$class = 'MyClass';
new $class();
Цитата ("LastDragon"):
Вариант с отражением удобен когда перед созданием нужно проверить реализует ли класс требуемый интерфейс
именно то что нужно. Так как цель всего этого подгружать модули. Спасибо
205 повідомлень
#15 років тому
LastDragon, amatory666 соберетесь передавать аргументы в конструктор - поймете о чем я 
49 повідомлень
#15 років тому
e1it3Цитата:всего то достаточно объявлять в каждом классе конструктор по умолчанию...