autoload differnece entre classe et interface php

Je cherche le problème suivant que j'ai. Les noms de fichier de classe de notre projet sont nommés logon.class.php Mais le fichier d'interface de cette classe s'appelle logon.interface.php

Mon problème est que lorsque la méthode de chargement automatique s'exécute, je devrais être capable de détecter s'il s'agit d'un appel de classe ou d'un appel d'interface.

<?php 
function __autoload($name){
    if($name === is_class){
        include_once($name.'class.php');
    }elseif ($name === is_interface){
         include_once($name.'interface.php');
    }
}
?>
2
Comment définir une classe et une interface du même nom et s’attendre à utiliser les deux? Essayez d’exécuter ceci: class x {} interface x {}
ajouté l'auteur Explosion Pills, source
Je fais ce que Stoosh fait aussi. J'ai IClassName pour les interfaces, AClassName pour les classes abstraites et CClassname pour les classes.
ajouté l'auteur F21, source
En plus de ce que @tandu a dit, vous devriez sérieusement jeter un oeil à PSR-0 . Sérieusement.
ajouté l'auteur igorw, source
J'ajoute généralement I au début du nom de fichier et du nom de l'interface
ajouté l'auteur Stoosh, source
Dans le passé, j'utilisais aussi ce préfixe avant l'interface. Mais maintenant, avec l'utilisation de namespace, j'ai un namespace spécifique pour l'interface
ajouté l'auteur Jan Van Looveren, source

3 Réponses

Vous pouvez utiliser ReflectionClass :: isInterface pour déterminer si la classe est une interface. .

$reflection = new ReflectionClass($name);

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

Dans votre cas, vous devrez probablement utiliser ex_fichier en premier sur $ name.interface.php et $ name.class.php pour déterminer si ils existent, requièrent celui qui existe, puis vérifient si c'est une interface.

Cependant, mon avis est que cela pourrait causer des problèmes en aval. Que faire si vous avez MyClass.class.php et MyClass.interface.php ?

3
ajouté
Cela nécessite une instance de la classe ..
ajouté l'auteur Explosion Pills, source
vous avez raison, mais vous ne pouvez le faire que pour les classes qui existent déjà.
ajouté l'auteur Explosion Pills, source
@tandu, le constructeur de ReflectionClass ne nécessite pas forcément d'instance. Vous pouvez transmettre une chaîne du nom de la classe.
ajouté l'auteur F21, source
@xdazz: S'il vous plaît élaborer :)
ajouté l'auteur F21, source
Utiliser la réflexion en chargement automatique est une très mauvaise idée.
ajouté l'auteur xdazz, source

Pour éviter les conflits de noms de classes, vous pouvez utiliser des espaces de noms. Vérifiez les spécifications du PSR-0.

Consultez également cet post . . Si vous lisez le contenu du fichier avant de l'inclure, vous pouvez le tokeniser et déterminer s'il contient une interface ou une classe, sans charger la classe/interface. Gardez à l'esprit que les interfaces et les classes ne peuvent pas avoir le même nom

Remarque: En utilisant cette méthode, vous pouvez réellement modifier le nom de l'interface au moment de l'exécution (avant de charger la classe, bien que cela semble une très bonne pratique).

0
ajouté

Vous devriez avoir des conventions de nommage pour vos classes et interfaces, par exemple. votre nom de classe est logon et le nom d'interface logon_interface , vous pouvez facilement différencier les deux. Par exemple, séparez $ name par un trait de soulignement et vérifiez si le dernier élément est interface .

0
ajouté