ФорумПрограммированиеPHP для идиотовPHP и ООП → __autoload

__autoload

  • Patrick

    Сообщения: 506 Репутация: N Группа: Кто попало

    Spritz 24 июля 2007 г. 4:36, спустя 1 час 34 минуты 17 секунд

    уверен, что file_exists() по всем доступным папкам будет работать неприемлимо долго?

    Да уверен… для каждого класса это расточительно.
    По имени класса невозможно определить пакет, которому он принадлежит?

    Человек сможет, машина нет.
    Может быть искать класс этим методом и кешировать результат для каждого класса, а не устраивать периодически полную индексацию?

    Помоему полная индексация проще чем, кэширование для всего
  • Pan

    Сообщения: 35 Репутация: N Группа: Кто попало

    Spritz 24 июля 2007 г. 10:18, спустя 5 часов 41 минуту 36 секунд


    Человек сможет, машина нет.

    машина тоже может :)
    функция __autoload как раз этим и занимается
    если назвать класс вот так
    my_super_puper_class
    и положить его в папку lib/my/super/puper/class/my_super_puper_class.php
    то __autoload будет выглядеть примерно так

    function __autoload($cls)
    {
    $sPath1 = str_replace("_", "/", $cls);
    $sPath2 = "lib/$sPath1/$cls.php";
    require_once $sPath2;
    }

  • Patrick

    Сообщения: 506 Репутация: N Группа: Кто попало

    Spritz 24 июля 2007 г. 10:41, спустя 23 минуты 5 секунд

    my_super_puper_class - это как в PEAR вот от этого я и хочу уйти! у меня есть пакет DataBase т.е. я класс DataBase должен лежать в папке lib, что не приемлемо, логически + куда девать интерфейсы?
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 24 июля 2007 г. 13:35, спустя 2 часа 53 минуты 54 секунды

    Можно не распространять один способ на все либы.
    1. Одно из достоинств пакетов в других языках, это распределение библиотек по пространствам имен. В php это невозможно, хотя есть надежда на лучшее. В php для достижения подобия данного эффекта обычно приходится извращаться с именами, в самом распространенном случае — давать им префиксы. Не всегда это удобно, но часть библиотек можно реализовать данным образом.
    2. Наиболее быстрый и гибкий, в плане расположения файлов и классов в них, способ — держать, обновляемый вручную конфиг. Здесь можно и к именам файлов не привязываться и несколько связанных классов/интерфейсов хранить в одном файле. Не всегда может быть удобно при частом добавлении/удалении библиотек, но базовую структуру классов можно держать в нем.
    3. Динамическая индексация с кешированием. Здесь мне все-таки кажется более практичным подход, поиска конкретного файла по запросу конкретного класса. Несколько file_exists() с учетом кеша ФС вряд ли будут сильно тормозить. А ждать 30 минут, пока там все обновиться не слишком, имхо, удобно.
  • Patrick

    Сообщения: 506 Репутация: N Группа: Кто попало

    Spritz 25 июля 2007 г. 6:35, спустя 17 часов 15 секунд

    1. Давать префиксы не люблю… пространства имен с одной стороны благо, но нынешняя реализация в php мне вообе не нравится
    2. обновляемый вручную конфиг. - нет уж спасибо! А поддерживать его в нормальном виде Большой гемор
    3. есть класс UserAccess, какой должен быть file_exists() ? Можно написать class.UserAccess.php, можно UserAccess.class.php ну и папок у меня порядка 10, в них еще подпапки. так что много получается придётсяв ызывать file_exists().
  • speedleader

    Сообщения: 28 Репутация: N Группа: Кто попало

    Spritz 9 октября 2007 г. 17:58, спустя 76 дней 11 часов 22 минуты

    Дело продвинулось? )
  • Patrick

    Сообщения: 506 Репутация: N Группа: Кто попало

    Spritz 9 октября 2007 г. 18:00, спустя 2 минуты 2 секунды

    есть консольная утилита стоящая конфиг, ну и собственно сама функция autoload….

Пожалуйста, авторизуйтесь, чтобы написать комментарий!