Как автоматически загружать расширенные классы? - PullRequest
3 голосов
/ 18 сентября 2009

Я планирую использовать функцию автозагрузки PHP для динамической загрузки только нужных файлов классов. Теперь это может создать огромный беспорядок, если каждая функция имеет отдельный файл, поэтому я надеюсь и спрашиваю, есть ли способ, чтобы связанные классы оставались в 1 файле класса и при этом автоматически загружались

function __autoload($class_name){
    include('classes/' . $class_name . '.class.php');
}

Допустим, есть имя класса животных, а затем другой класс с именем собаки. Класс собак расширяет класс животных, теперь, если бы я назвал класс собак, но НЕ назвал класс животных, будет ли загружен файл класса животных?

Ответы [ 4 ]

9 голосов
/ 18 сентября 2009

Рассматривали ли вы точные определения местоположений вашего класса? Иногда имеет смысл группировать связанные классы.

Вот проверенный способ обращения с ним.

Этот код помещается в auto_prepend_file (или включается первым)

class Import
{
    public static $_AutoLoad = array();
    public static $_Imported = array();

    public static function Load($sName)
    {
        if(! isset(self::$_AutoLoad[$sName]))
            throw new ImportError("Cannot import module with name '$sName'.");

        if(! isset(self::$_Imported[$sName]))
        {
            self::$_Imported[$sName] = True;
            require(self::$_AutoLoad[$sName]);
        }
    }

    public static function Push($sName, $sPath)
    {
        self::$_AutoLoad[$sName] = $sPath;
    }

    public static function Auto()
    {
        function __autoload($sClass)
        {
            Import::Load($sClass);
        }
    }
}

И в своем файле начальной загрузки определите ваши классы и в каком файле они находятся.

//Define autoload items
Import::Push('Admin_Layout',        App::$Path . '/PHP/Admin_Layout.php');
Import::Push('Admin_Layout_Dialog', App::$Path . '/PHP/Admin_Layout.php');
Import::Push('FileClient',          App::$Path . '/PHP/FileClient.php');

И наконец, включите автозагрузку, вызвав

Import::Auto()
<ч />

Одна из приятных вещей заключается в том, что вы можете определить «Модули»:

Import::Push('MyModule',          App::$Path . '/Module/MyModule/Init.php');

А затем явно загружать их при необходимости:

Import::Load('MyModule');

И одна из лучших частей - вы можете иметь дополнительные Import::Push строки в модуле, которые будут определять все его классы во время выполнения.

6 голосов
/ 18 сентября 2009

если бы я назвал класс собак, но НЕ называйте животных классом Файл класса животных все еще загружен?

Да. Когда вы загружаете класс, который расширяет другой класс, PHP должен загрузить базовый класс, чтобы он знал, что он расширяет.

re: идея хранения нескольких классов в файле: это не будет работать с предоставленной вами функцией автозагрузки. Один класс на файл - это действительно лучшая практика, особенно для классов с автозагрузкой.

Если в файле несколько классов, вам не следует пытаться автоматически загружать какие-либо классы из этого файла.

0 голосов
/ 26 мая 2015

Есть обходной путь, я только что использовал его, и, кажется, работает:

Предположим, у нас есть автозагрузочный класс с именем animals, который хранится в animals.class.php. В том же файле вы можете иметь другие классы, которые расширяют животных

    class animals{
        static function load(){
            return true;
        }
    }


    class dogs extends animals{

    }

    class cats extends animals{

    }

Теперь ... когда вам нужно использовать ваш класс dogs, вам требуется PHP, автозагрузка его родительского класса (и, делая это, вы уверены, что он также проанализирует все классы extendend внутри одного файла), поэтому вам просто нужно написать:

animals::load();
$fuffy = new dogs();
0 голосов
/ 18 сентября 2009

Да, он будет загружен, если вы не включите / не потребуете файл класса.

Вы должны всегда импортировать любые файлы, которые содержат необходимый код PHP. Сам PHP не может угадать имя, которое вы дали вашему файлу класса. В отличие, например, от Java, в PHP нет требований к именам файлов для классов.

Распространенным способом решения этой проблемы является группирование связанных классов в один файл. Создание «модуля».

...