Федор К.
2 сообщения
#15 лет назад
Суть проблемы.
Есть некий класс. Имя которого задается в строковой переменной, а сам класс инклайдиться.
Как создать объект этого класса.


Пример
Есть
MyClass.php
=========
class MyClass {
...
}
==========
Код
<?
$class = "MyClass";
include $class . "php";

и теперь хочу получить объект. Как?
Евгений Кашкаров
450 сообщений
#15 лет назад
Во-первых, исправьте
nclude $class . ".php";

и попробуйте
$ob = new MyClass;
Евгений Кашкаров
450 сообщений
#15 лет назад
Перечитал ещё раз, я вас неправильно понял. Попробуйте
eval('$ob = new '.$class.';');
Владимир О.
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', $args);//$args = массив аргументов

где-то на 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));
}

единственный верный вариант работает от 5.1.3
Алексей Л.
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Цитата:
всего то достаточно объявлять в каждом классе конструктор по умолчанию...