За последние 24 часа нас посетил 58701 программист и 1816 роботов. Сейчас ищут 886 программистов ...

Альтернатива функции __autoload() в PHP4

Тема в разделе "Прочие вопросы по PHP", создана пользователем enshtein, 20 сен 2007.

  1. enshtein

    enshtein Активный пользователь

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    В PHP версии 5 появилось новая функция позволяющая загружать файлы классов "на лету" под названием __autoload().
    Немного подумав над решением той же проблемы в PHP 4-ой версии накропал такой вот код:
    Файл класса:
    PHP:
    1. <?php
    2. class View
    3. {
    4.     function View() {
    5.         //
    6.     }
    7.  
    8.     function source() {
    9.         echo '<hr><br>';
    10.         show_source(__FILE__);
    11.     }
    12. }
    13. ?>
    Непосредственно рабочий скрипт:
    PHP:
    1. <?php
    2. // путь к библиотеке классов
    3. define('_LIB_PATH', 'w:/home/unit/www/class/lib');
    4.  
    5. // подключаем файл класса, создаем экземпляр класс
    6. function class_initialize($name, $class) {
    7.     eval('global $' . "$name;");
    8.     if (!class_exists($class)) {
    9.         require_once(_LIB_PATH . "/$class.php");
    10.         eval('$' . "$name = new $class();");
    11.     }
    12.     else {
    13.         eval('$' . "$name = new $class();");
    14.     }
    15. }
    16.  
    17. class_initialize('html', 'View');
    18. // вызываем метод класса
    19. $html->source();
    20. ?>
    Т. о., у нас есть каталог-библиотека классов в которой каждому классу соответсвует один файл имя которого - есть имя класса! При первом обращении к классу (т.е. при попытке создать экземляр класса) через функцию class_initialize() - она (эта функция) проверяет был ли обьявлен класс и если нет, то подключает файл класса и создает экземпляр класса! Единственное, что я пока не учел - это передача параметров в конструктор класса - но это уже просто я думаю! :)

    Господа выскажите свое мнение пожалуйста по поводу такого вот решения или предложите как можно изменить, доработать данный код!
     
  2. vb

    vb Активный пользователь

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    Плохо то что у вас каждая переменная получается глобальной.
    И вообще eval - это зло.

    PHP:
    1. <?
    2.  
    3. class CTestInit{
    4.    
    5.     var $a = 1;
    6.  
    7.     function CTestInit()
    8.     {
    9.         $this->up_a();
    10.     }  
    11.     function up_a()
    12.     {
    13.         $this->a++;
    14.     }
    15.     function get_a()
    16.     {
    17.         return $this->a;
    18.     }
    19.  
    20. }
    21. define('_LIB_PATH', 'w:/home/unit/www/class/lib');
    22.  
    23. function &class_initialize($class) {
    24.     print "Started class_init <br />\n";
    25.     if (!class_exists($class)) {
    26.         require_once(_LIB_PATH . "/$class.php");
    27.     }
    28.     $obj = new $class;
    29.     return $obj;
    30. }
    31.  
    32. $a = class_initialize('CTestInit');
    33. print " A:".$a->get_a()." <br />\n";
    34.  
    35. $b = class_initialize('CTestInit');
    36. print " B:".$b->get_a()."<br />\n";
    37.  
    38. $a->up_a();
    39. print " A:".$a->get_a()."<br />\n";
    40.  
    41. ?>
    Насчет знака & перед именем функции... смысл в том что obj не создается заново а передается тот же самый. Если что то напутал в этом месте поправьте.
     
  3. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Непосредственно рабочий скрипт:
    PHP:
    1. <?php
    2. $html= inc( 'html/View', param1, param2 );
    3. // вызываем метод класса
    4. $html->source();
    5. ?>
    и не занимайся ерундой :)

    сорц: http://php.ru/forum/viewtopic.php?t=6406
     
  4. enshtein

    enshtein Активный пользователь

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    ИМХО наворочено немного, да и тут задача более конкретная - просто подгрузить файлы классов когда найдо!
     
  5. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    я к тому, что нет никакого смысла в том, чтобы передавать имя класса и по нему определять путь к классу - достаточно просто передать путь, а имя можно даже и не знать.
     
  6. enshtein

    enshtein Активный пользователь

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    ... а это смотря какую концепцию вы применяете! Я к примеру, взял за правило держать все файлы классов в папке lib, и называть файл соответственно имени класса! А потому данная схема с определением, тока не пути полностью (как вы сказали), а именно имени файла по имени инициализируемого класса мне очень даже подходит в рамках естественно моих принципов :)
     
  7. enshtein

    enshtein Активный пользователь

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    я писал
    но всеже появился вопрос, как же организовать передачу значений аргументов конструктора, передавать их в массиве, так:
    class_initialize('CTestInit', $args = array('arg1', 'arg2', 'arg3'));
    но что делать с этим массивом потом в функции class_initialize()???
     
  8. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    enshtein, когда количество классов в твоей системе перевалит на 1000, ты поймёшь для чего придумали директории, но будет уже поздно :)
     
  9. enshtein

    enshtein Активный пользователь

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    такое врятли случится - куда мне стока??? :)
     
  10. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    "640 килобайт предостаточно для любой операционной системы" (с) Б.Г.