Как автозагрузка расширенных классов?

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

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

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

Solutions Collecting From Web of "Как автозагрузка расширенных классов?"

если бы я должен был назвать класс собак, но не называть класс животных, будет ли загружен файл классов животных?

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

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

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

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

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

Этот код помещается в 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'); 

И, наконец, включите AutoLoad, позвонив

 Import::Auto() 

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

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

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

 Import::Load('MyModule'); 

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

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

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

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

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

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

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

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

 animals::load(); $fuffy = new dogs();