2009-09-17 2 views
2

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

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

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

+0

Я рекомендую вам также взглянуть на стандарты кодирования Pear/Zend для соглашений об именах файлов, как обеспечить хорошие рекомендации. IMHO, использование .class.php в имени файла является избыточным и не рекомендуется. Вы можете автозагрузить, используя что-то вроде: require (str_replace ('_', DIRECTORY_SEPARATOR, $ className), чтобы упростить и упорядочить. – Tres

+0

BTW, имеющий несколько классов на файл, обычно не считается хорошей практикой для удобства обслуживания кода. – Tres

+0

Ха-ха, извините обо всех комментариях, но fyi, моя строка «require» выше - это не правильный синтаксис. Это должно быть: require (str_replace ('_', DIRECTORY_SEPARATOR, $ className). '.php'); Должен иметь модуль, который проверял мой комментарий;) – Tres

ответ

5

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

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

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

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

0

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

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

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

+0

Я думаю, что вы неверно истолковали вопрос, я не спрашиваю, будет ли php догадываться, где находится или называется файл. Я спрашиваю, есть ли у меня автозагрузка, чтобы загрузить файл с именем тот же, что и класс, но затем вызовите класс, который находится в том же файле, что и класс, потому что он просто расширяет класс и не имеет собственного имени. – JasonDavis

9

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

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

Этот код помещается в 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 строк в модуле, который будет определять все его классы во время выполнения.

+0

Хорошее решение, но ознакомьтесь с более продвинутым стандартом PSR-4, который является расширением того же метода: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md –

0

Там обходной путь, я просто использовал это, и это, кажется, работает:

Давайте предположим, что у нас есть класс с именем автоматически загружаются животные сохраняются в 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(); 
Смежные вопросы