Exemple:
classname.php p> dans un autre fichier ... p> la sortie de la sortie de Ce code est:
cela va écraser tout fort> p> au lieu de cela:
Nom de classe n'existe pas .... strong> p> Fonction de chargement automatique: p>
4 Réponses :
Utilisez Class_exists à l'intérieur de la fonction AutoLoad, puis ne l'utilisez jamais. C'est le point de l'autochargeur.
class App { static private $_instance = NULL; public function __construct() { spl_autoload_register('app::autoLoader'); } public function __destruct() { } public static function getInstance() { if(self::$_instance == NULL) { self::$_instance = new App(); } return self::$_instance; } public static function autoLoader($class) { $className = stripslashes($class); if (class_exists($className)) { return; } require $className.'.class.php'; } }
HEIN? Non, ce n'est pas ... Il y a beaucoup d'utilisations pour les classes_existes. Dont l'un est de voir si la classe est chargée pour commencer (voir si elle est disponible). En outre, il n'y a aucune raison d'appeler class_existes code> à partir de la fonction AutoLoad car vous savez que cela ne le fait pas déjà (à moins que quelqu'un l'appelle manuellement, mais ils ne devraient pas quand même pas). Oh, et si j'étais vous, je ferais des vérifications pour déterminer si le fichier existe effectivement avant de faire un aveugle
exiger code> dessus. Sinon, vous perdez la possibilité de vérifier si une classe est chargée (qui peut être utile pour les adaptateurs, etc.) ...
Dans mon exemple, tous les fichiers de classe sont dans le même répertoire. Mais oui, le chèque de fichier est une bonne idée.
Que se passe-t-il est assez logique. Votre fonction __AutoLoad est probablement juste avec CLASSNAME.PHP, donc il exécutera la déclaration d'écho que vous avez obtenue. P>
Si vous essayez de décider s'il existe une définition de classe dans un fichier, vous pouvez lire le contenu du fichier (en utilisant File_Get_Contents ou une fonction similaire), puis numérisez ces contenus pour une définition de classe à l'aide d'expressions régulières ou en utilisant TOKEN_GET_ALL < / a> (voir Déterminer quelles classes sont définies dans un Fichier de classe PHP ). P>
Ce n'est tout simplement pas possible, y compris le code exécutera rien b> qui n'est pas contenu dans une fonction ou une classe. Donc, non plus d'inclure le fichier ni de mettre les instructions d'écho à l'intérieur d'une fonction / classe.
Mais je ne sais pas si le fichier aura une classe ou est un script simplement, car j'ai une liste de fichiers, ce que je dois faire est de savoir à quoi ces noms de fichiers sont des cours ou non.
Vous devriez mentionner cela dans votre question initiale, nous ne pouvons pas lire les esprits ici. Si vous essayez de décider s'il existe une définition de classe dans un fichier, vous pouvez lire le contenu du fichier (à l'aide de file_get_contents code> ou une fonction similaire), puis numérisez ces contenus pour une définition de classe en utilisant expressions régulières.
BTW Selon ce que vous essayez de faire, vous pouvez également utiliser token_get_all code> (voir
Wimvds, pouvez-vous mettre cela comme une réponse?
OK, alors voici comment cela fonctionne en interne.
Lorsque vous essayez d'utiliser une classe qui n'existe pas, il appelle chacun de l'un des Lorsque vous appelez Donc tout dépend de ce que vous faites dans la fonction AutoLoad. Si vous faites quelque chose comme: p> Il va tuer l'exécution et ne fonctionnera pas comme prévu. Au lieu de cela, vous devriez faire: p> C'est tout ce que vous avez besoin de faire. P> MAINTENANT, vous ne voulez pas que le fichier soit exécuté. C'est très bien. Il y a une solution facile à cela. Ne mettez pas ce fichier dans le même répertoire que vos classes automatiques. Il défait le but de l'autoloading. P> La seule autre solution serait de stocker une carte des noms de classe pour les noms de fichiers et de baser votre distribution automatique de celle-ci. Sinon, il exécuterait toujours le fichier (car c'est ce que vous demandez à cela) ... P> P> spl_autooad code> rappelez un par un jusqu'à ce que la classe existe (et la fonction
autoluoad code> est l'une d'elles). S'il n'existe pas à la fin de la chaîne, il augmente l'erreur de la classe non trouvée. P>
class_existes code> sans le deuxième paramètre (qui lui dit de ne pas essayer Pour le charger s'il n'existe pas), il appelle la chaîne de
spl_autooad code> rappels jusqu'à ce qu'il trouve la classe ou la dernière méthode est appelée. Ensuite, il retourne si cela a trouvé la classe. P>
Utilisation de CLASS_EXISTS touchera l'autoloadeur par défaut, c'est pourquoi vous voyez votre problème. Vous pouvez contourner l'autochargeur enregistré en définissant le deuxième param param w sur false. p> p>
Je ne sais pas pourquoi cela a été évité quand il s'agit de la documentation réelle.
Parce que vous ne contournez pas l'autoloadeur en définissant le deuxième paramètre sur FALSE. Vous contournez simplement l'erreur étant soulevée si la classe ne se chargeait toujours pas.
Cela n'a aucun sens de la documentation du tout. Pourquoi l'appelleraient-ils «autoload» avec un Bool Val?
Il est évident nécessaire d'utiliser AutoLoad car la classe n'est pas chargée!
Montrez votre fonction AutoLoad ... il devrait afficher
classname n'existe pas .... Code> Après le
Ceci écrasera tout code>, car il ne s'en soucie pas par défaut si le la classe n'est pas chargée. Je suppose que vous tuez l'exécution dans la fonction code> autoluoad code> si vous ne trouvez pas la classe, et que vous ne devriez pas être ...
Du code donné que les résultats ne peuvent pas être reproduits. Alors postez un peu plus de code.
La fonction de __AutoLoad est une fonction qui charge la classe et fonctionne correctement. Le problème est quand il trouve des fichiers qui ont des codes d'exécution pour une raison quelconque, comme dans l'exemple
Ce que j'essaie de faire est de savoir ce que les chaînes sont des cours ou non d'une liste de noms de fichiers.
Non, montrez votre fonction. Par défaut, PHP ne se comporte pas comment vous décrivez (> = 5.2 au moins). La cause est donc plus que probable dans votre code. Donc, si vous montrez votre code, nous pourrons peut-être aider. Sinon, tout est un coup de feu dans le noir ...