автозавантаження відрізняється між класом та інтерфейсом 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');
    }
}
?>
2
Як ви можете визначити клас і інтерфейс з тим самим ім'ям і очікувати використання обох? Спробуйте виконати це: class x {} інтерфейс x {}
додано Автор Explosion Pills, джерело
Я роблю те, що робить і Stoosh. У мене є IClassName для інтерфейсів, AClassName для абстрактних класів і CClassname для класів.
додано Автор F21, джерело
Крім того, що сказав @ tandu, слід серйозно поглянути на PSR-0 . Серйозно
додано Автор igorw, джерело
Я зазвичай додаю I до початку назви файлу та інтерфейсу
додано Автор Stoosh, джерело
У минулому я використовував також цей префікс перед інтерфейсом. Але тепер, використовуючи простір імен, у мене є простір імен, специфічний для інтерфейсу
додано Автор Jan Van Looveren, джерело

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 ?

3
додано
Для цього потрібен екземпляр класу ..
додано Автор Explosion Pills, джерело
Ви маєте рацію, але ви можете зробити це тільки для класів, які вже існують.
додано Автор Explosion Pills, джерело
@ tandu, Controller ReflectionClass не вимагає екземпляр. Ви можете передати рядок імені класу.
додано Автор F21, джерело
@ xdazz: Будь-ласка, роз'ясніть :)
додано Автор F21, джерело
Використання відображення в автозавантаженні - це дуже погана ідея.
додано Автор xdazz, джерело

Щоб уникнути зіткнень класу назви, ви можете використовувати простір імен. Перевірте технічні характеристики PSR-0.

Також перевірте це повідомлення . Якщо ви прочитаєте вміст файлу перед тим, як включити його, ви можете токенувати його і визначити, чи файл містить інтерфейс або клас, без фактичного завантаження класу/інтерфейсу. Пам'ятайте, що інтерфейси та класи не можуть мати однакове ім'я

Примітка. За допомогою цього методу ви можете фактично змінити назву інтерфейсу під час виконання (перед завантаженням класу, хоча це, здається, дуже хороша практика)

0
додано

Ви повинні мати деякі умовні позначення для ваших класів та інтерфейсів, наприклад ім'я вашого класу - logon та ім'я інтерфейсу logon_interface , тоді ви можете легко розрізняти ці два. Наприклад, виділіть $ name підкресленням і перевірте, чи останній елемент є інтерфейсом .

0
додано
Ukrainian PHP comunity
Ukrainian PHP comunity
885 учасників

dev-ua/php