Автозагрузка различий между классом и интерфейсом php

Я ищу следующую проблему, которая у меня есть. Имена файлов классов нашего проекта называются logon.class.php, но файл интерфейса для этого класса называется logon.interface.php

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

<?php 
function __autoload($name){
    if($name === is_class){
        include_once($name.'class.php');
    }elseif ($name === is_interface){
         include_once($name.'interface.php');
    }
}
?>

3 ответа

Решение

Вы можете использовать ReflectionClass::isInterface, чтобы определить, является ли класс интерфейсом.

$reflection = new ReflectionClass($name);

if ($reflection->isInterface()){
  //Is an interface
}else{
  //Not an interface
}

В вашем случае вам, вероятно, придется использовать file_exist сначала на $name.interface.php а также $name.class.php чтобы определить, существуют ли они, требуется тот, который существует, а затем проверьте, является ли он интерфейсом.

Тем не менее, я считаю, что это может вызвать проблемы в будущем. Что делать, если у вас есть MyClass.class.php а также MyClass.interface.php?

У вас должны быть некоторые соглашения об именах для ваших классов и интерфейсов, например, ваше имя класса logon и имя интерфейса logon_interface, тогда вы можете легко различать два. Например, взорваться $name подчеркиванием и проверьте, является ли последний элемент interface,

Чтобы избежать конфликтов имен классов, вы можете использовать пространства имен. Проверьте спецификации PSR-0.

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

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

Другие вопросы по тегам