В PHP версии 5 появилось новая функция позволяющая загружать файлы классов "на лету" под названием __autoload(). Немного подумав над решением той же проблемы в PHP 4-ой версии накропал такой вот код: Файл класса: PHP: <?php class View { function View() { // } function source() { echo '<hr><br>'; show_source(__FILE__); } } ?> Непосредственно рабочий скрипт: PHP: <?php // путь к библиотеке классов define('_LIB_PATH', 'w:/home/unit/www/class/lib'); // подключаем файл класса, создаем экземпляр класс function class_initialize($name, $class) { eval('global $' . "$name;"); if (!class_exists($class)) { require_once(_LIB_PATH . "/$class.php"); eval('$' . "$name = new $class();"); } else { eval('$' . "$name = new $class();"); } } class_initialize('html', 'View'); // вызываем метод класса $html->source(); ?> Т. о., у нас есть каталог-библиотека классов в которой каждому классу соответсвует один файл имя которого - есть имя класса! При первом обращении к классу (т.е. при попытке создать экземляр класса) через функцию class_initialize() - она (эта функция) проверяет был ли обьявлен класс и если нет, то подключает файл класса и создает экземпляр класса! Единственное, что я пока не учел - это передача параметров в конструктор класса - но это уже просто я думаю! Господа выскажите свое мнение пожалуйста по поводу такого вот решения или предложите как можно изменить, доработать данный код!
Плохо то что у вас каждая переменная получается глобальной. И вообще eval - это зло. PHP: <? class CTestInit{ var $a = 1; function CTestInit() { $this->up_a(); } function up_a() { $this->a++; } function get_a() { return $this->a; } } define('_LIB_PATH', 'w:/home/unit/www/class/lib'); function &class_initialize($class) { print "Started class_init <br />\n"; if (!class_exists($class)) { require_once(_LIB_PATH . "/$class.php"); } $obj = new $class; return $obj; } $a = class_initialize('CTestInit'); print " A:".$a->get_a()." <br />\n"; $b = class_initialize('CTestInit'); print " B:".$b->get_a()."<br />\n"; $a->up_a(); print " A:".$a->get_a()."<br />\n"; ?> Насчет знака & перед именем функции... смысл в том что obj не создается заново а передается тот же самый. Если что то напутал в этом месте поправьте.
Непосредственно рабочий скрипт: PHP: <?php $html= inc( 'html/View', param1, param2 ); // вызываем метод класса $html->source(); ?> и не занимайся ерундой сорц: http://php.ru/forum/viewtopic.php?t=6406
ИМХО наворочено немного, да и тут задача более конкретная - просто подгрузить файлы классов когда найдо!
я к тому, что нет никакого смысла в том, чтобы передавать имя класса и по нему определять путь к классу - достаточно просто передать путь, а имя можно даже и не знать.
... а это смотря какую концепцию вы применяете! Я к примеру, взял за правило держать все файлы классов в папке lib, и называть файл соответственно имени класса! А потому данная схема с определением, тока не пути полностью (как вы сказали), а именно имени файла по имени инициализируемого класса мне очень даже подходит в рамках естественно моих принципов
я писал но всеже появился вопрос, как же организовать передачу значений аргументов конструктора, передавать их в массиве, так: class_initialize('CTestInit', $args = array('arg1', 'arg2', 'arg3')); но что делать с этим массивом потом в функции class_initialize()???
enshtein, когда количество классов в твоей системе перевалит на 1000, ты поймёшь для чего придумали директории, но будет уже поздно