J'ai le code suivant dans le fichier appelé quand j'essaie de charger le < Code> abstractclass code> de i get Qu'est-ce que je fais mal? Devrais-je simplement inclure le fichier plutôt que de le charger? P> merci p> p> abstractclass.php code> dans les bibliothèques code> dossier code> xxx pré>
contrôleurs code> comme suit: p>
impossible de charger la classe demandée: abstractclass code > Erreur. P>
5 Réponses :
Bien évidemment, vous ne pouvez pas charger une classe abstraite directement car cela va à l'encontre du point d'une classe abstraite. p>
Vous pouvez mettre une classe abstraite dans un fichier avec une autre bibliothèque, mais c'est un peu inutile et va à l'encontre du «fichier d'une classe unique» standard que cI (et toutes les bonnes normes) suggèrent. P>
Vous pouvez inclure ce fichier avec un () dans vos fichiers de bibliothèque ou configurer une fonction __AutoLoad () pour le faire pour vous. Le meilleur endroit pour un __Autoload () est le bas de config.php. P>
Bonjour, vous avez dit quel est le problème et la moitié de la solution comme je pouvais comprendre. S'il vous plaît Phil (avec tout le respect que je peux donner pour les charges de travail que vous avez faites et donnée à la communauté) Pardonnez-moi, je ne pouvais toujours pas trouver et imaginer comment faire la chose suivante que vous avez mentionnée dans la réponse ci-dessus et aussi Sur votre exemple contrôleur! Ce qui procède: le meilleur endroit pour un __AutoLoad () est le bas de config.php. Dans votre code d'exemple, il est également mentionné pour faire la même chose à supprimer. Mais il n'y a pas d'endroit où j'aurais pu trouver comment le faire! S'il vous plaît, expliquez
Je n'ai vu aucun exemples autour du Web des classes abstraites avec CI, donc je voulais confirmer que vous pouvez avoir une bibliothèque abstraite. Il existe de très bonnes raisons qui sont fondamentales pour lesquelles les classes abstraites sont utiles. Fondamentalement pour que je puisse assurer que les classes d'enfants suivent certaines consistances.
Faites-moi savoir si vous avez besoin d'un exemple, car vous devez inclure manuellement la classe abstraite, assurez-vous que vous ne le faites qu'une fois, vous ne recevez donc pas de problèmes avec des classes de redécrigation. P>
Ne pas Oubliez si vous avez une fonction statique ou une variable de la classe abstrait, vous pouvez toujours l'accéder directement sans avoir à charger la classe comme dans le P>
AbstractClass::static_method_you_want_to_call();
J'utilise des classes abstraites avec des bibliothèques de Cadedigniter, car j'ai des méthodes communes que je souhaite que toutes les classes héritées utilisent sans signification. Je ne sais pas si ce que je suis sur le point de suggérer est la meilleure pratique. Je soupçonne que ce n'est pas le cas, mais je trouve personnellement cela utile. Voici comment je le fais:
Créez un nouveau dossier em> classes dans le dossier d'application de codeigniter. p> li>
Ajoutez ce dossier au chemin. (Je fais habituellement cela dans le contrôleur.) P>
$this->load->library('concrete_library');
Créez les classes abstraits, ou d'autres classes, dans le dossier classes em>. p> li>
Créer une bibliothèque de codeDigniter étendue: p>
Utilisez la bibliothèque comme normale: p>
require_once('an_abstract_class.php');
class concrete_library extends an_abstract_class {
if (!strstr(get_include_path(), APPPATH . 'classes')) {
ini_set('include_path', get_include_path() . ':' . APPPATH . 'classes');
}
OK. Je sais que c'est bien en retard, mais je suis sûr que beaucoup de gens ont des questions à ce sujet.
Ceci est en fait une limitation de la classe de chargeuse principale, car elle tente d'instancier chacun des éléments définis par le premier paramètre. Comme nous le savons tous, les classes abstraites de leur définition même sont abstraites et ne peuvent être instanciées. Alors, comment pouvons-nous contourner cela? P>
Mais surtout: Comment pouvons-nous contourner cela tout en se conformant aux normes du Codedigniter? Strong> P> depuis que j'ai Juste juste commencée à utiliser Cadedigniter, je ne peux pas vraiment dire que certaines extensions de base ont été traitées dans le passé. Toutefois, dans la version la plus récente, le CodeDeChech Framework vous permettra d'étendre et de remplacer ses classes principales en préfixant le nom de fichier avec votre préfixe de sous-classe définie (dans la plupart des cas, My_ ») suivi du nom du fichier que vous envisagez de s'étendre. p> * / application / core / my_loader.php * p> chances est bon que si vous savez utiliser des classes abstraites, vous savez ce que cela fait . Fondamentalement, cette classe hérite maintenant de toutes les propriétés et méthodes de la classe CI_Loader d'origine. L'extrait de code ci-dessus est techniquement une duplication exacte de la classe de chargeuse d'origine, mais la chose la plus importante ici est que maintenant cette classe prendra la relève de toutes les méthodes de charge plutôt que l'original. P> Tout ce que nous avons besoin de faire Fournit la classe de chargeur avec les moyens de savoir s'il est chargé et instanciant une classe de béton, ou s'il s'agit simplement d'une classe abstraite. P> Il existe deux méthodes qui gèrent le chargement des bibliothèques: P > Méthode 1) Méthode 1 gère le traitement de tous les paramètres qui y est transmis en itération par lui-même si le premier paramètre est un tableau, veille à ce que les données fournies sont propres. et empêche toute action d'être prise si certains critères ne sont pas satisfaits. p> Méthode 2 gère le chargement réel des actifs nécessaires, la manipulation des erreurs, etc. P> Nous pouvons remplacer le Comportement des méthodes 1 et 2 en les redéfinissant dans notre nouvelle classe My_Loader. Je l'ai fait en créant des répliques presque exactes des méthodes d'origine, mais avec l'ajout d'un 4ème paramètre qui - lorsque vrai - empêchera le chargeur d'instantiquer la classe de la bibliothèque définie dans la deuxième méthode. J'ai également inclus une méthode supplémentaire Ce qui suit est la classe My_Loader.php dans sa intégralité. Cela n'affectera aucun appels existants à la méthode de la bibliothèque. P> espère que cela aide! P> * / application / core / my_loader.php * p> Bibliothèque de fonctions publiques Code>
Méthode 2) Fonction protégée _ci_load_class code> p>
fonction publique abstract_library code> qui vous permettra de définir explicitement la bibliothèque comme abstrait de la mode sténographique. P>
<?php
$this->load->library("My_Abstract_Library", NULL, NULL, true);
/* -- OR -- */
$this->load->abstract_library("My_Abstract_Library");
?>
Il convient de noter que, car les classes abstraites ne peuvent pas être instanciées à partir de la classe Loader, en passant des paramètres $ ou $ Object_name ne fera rien et ne doit pas être utilisé dans une méthode de la bibliothèque traditionnelle. Si vous souhaitez transmettre des paramètres sur votre constructeur de classe abstrait, faites-le de la bibliothèque extension.
J'ai trouvé un moyen simple d'utiliser des classes abstraites dans CodeDigniter. Il suffit de suivre ces étapes. Allez dans les bibliothèques dans le dossier système
Système -> Bibliothèques -> lib.php p> Appelez cette libère de contrôleur. p> p>
Pourquoi chargez-vous la classe abstraite au lieu de concret?
Parce que je reçois une erreur différente quand je le fais.
Les classes abstraites ne peuvent pas être instanciées. Je pense que le codeigniter, IIRC, essaie de créer une instance pour attribuer comme attribut de
$ ceci code>, oui? Vous devriez probablement passer à l'erreur avec la classe de béton; Peut-être que nous pouvons résoudre celui-là.