Автозагрузка различий между классом и интерфейсом 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.
Также проверьте этот пост. Если вы прочитали содержимое файла перед его включением, вы можете разбить его на токены и выяснить, содержит ли файл интерфейс или класс, без фактической загрузки класса / интерфейса. Имейте в виду, что интерфейсы и классы не могут иметь одинаковые имена
Примечание. Используя этот метод, вы можете изменить имя интерфейса во время выполнения (перед загрузкой класса, хотя это кажется очень хорошей практикой).