12
votes

Il y a un moyen d'utiliser CLASS_EXISTES ET __AUTOLOAD sans crash le script?

Exemple:

classname.php xxx

dans un autre fichier ... xxx

la sortie de la sortie de Ce code est: cela va écraser tout

au lieu de cela: Nom de classe n'existe pas ....

Fonction de chargement automatique: xxx


6 commentaires

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 .... Après le Ceci écrasera tout , 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 autoluoad 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 ...


4 Réponses :


1
votes

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';
    }
}


2 commentaires

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 à 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 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.



0
votes

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.

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 ).


5 commentaires

Ce n'est tout simplement pas possible, y compris le code exécutera rien 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 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 (voir Stackoverflow.com/questions/928928/... )


Wimvds, pouvez-vous mettre cela comme une réponse?



12
votes

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 spl_autooad rappelez un par un jusqu'à ce que la classe existe (et la fonction autoluoad 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.

Lorsque vous appelez class_existes 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 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.

Donc tout dépend de ce que vous faites dans la fonction AutoLoad. Si vous faites quelque chose comme: xxx

Il va tuer l'exécution et ne fonctionnera pas comme prévu. Au lieu de cela, vous devriez faire: xxx

C'est tout ce que vous avez besoin de faire.

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.

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) ...


0 commentaires

12
votes

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. xxx

de Documentation PHP


3 commentaires

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?