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