автозагрузка differsece между классом и интерфейсом 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'); } } ?> 

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

 $reflection = new ReflectionClass($name); if ($reflection->isInterface()){ //Is an interface }else{ //Not an interface } 

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

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

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

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

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

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