Forum Webscript.Ru

Программирование => PHP => Тема начата: Aku Aku от 11 Апреля 2004, 18:16:20

Название: Динамическая загрузка класса. Как без eval()?
Отправлено: Aku Aku от 11 Апреля 2004, 18:16:20
в процессе работы скрипта, на основании данных в $_REQUEST нужно погрузить тот или иной класс. Делается это сейчас вот так:


$neededClassInstance = eval("return new ".$classDescriptor->className."(\\$param);");


есть ли способ сделать то же самое, но без eval-а? а то уж больно некрасиво получается
может есть какая либа/класс/whatever для динамической загрузки?
Название: Динамическая загрузка класса. Как без eval()?
Отправлено: AliMamed от 11 Апреля 2004, 20:45:21
Цитировать
Aku Aku:
есть ли способ сделать то же самое, но без eval-а?

а почему не сделать это через if? =) или так не круто? =)
неужели такое огромное количество классов, что их нельзя через if или switch отработать?
Название: Динамическая загрузка класса. Как без eval()?
Отправлено: Aku Aku от 11 Апреля 2004, 20:54:13
я  не уточнял зачем это нужно:
для фреймворка.
если делать через if то при добавлении нового модуля/действия нужно будет править класс контроллера, что не есть хорошо.
а через eval() действительно не круто =)
Название: Динамическая загрузка класса. Как без eval()?
Отправлено: Макс от 12 Апреля 2004, 12:29:28
пример из PEAR::Mail:

        $driver = strtolower($driver);
        include_once \'Mail/\' . $driver . \'.php\';
        $class = \'Mail_\' . $driver;
        if (class_exists($class)) {
            return new $class($params);
        } else {
            return PEAR::raiseError(\'Unable to find class for driver \' . $driver);
        }

(в оригинале перед include_once стоит собачка, но я ее обычно убираю)
Название: Динамическая загрузка класса. Как без eval()?
Отправлено: Aku Aku от 12 Апреля 2004, 12:36:38
да, то что надо. сенкс.
мог бы и сам догадаться в исходниках PEAR поискать :-)
Название: Динамическая загрузка класса. Как без eval()?
Отправлено: AliMamed от 12 Апреля 2004, 12:47:48
хм. я тоже сначала подумал о переменных классах, но чтото в мануале не нашел такого раздела=(