2009-08-25 7 views
0

J'ai récemment eu un problème avec un projet PHP que j'ai finalement réalisé était à la façon dont j'avais structuré mes classes. Si j'ai essayé d'inclure plus d'une classe dans une page et que les deux classes partageaient la même classe parente, le script a échoué. J'ai maintenant résolu le problème, mais je me demandais si quelqu'un pouvait m'expliquer exactement pourquoi ce que je faisais ne fonctionnait pas, parce que je n'ai pas vraiment compris! est ici une illustration de ce qui n'a pas fonctionné:Newbie php classe héritage question

classe A.
classe B étend A.
classe C étend A.
classe D étend B.
classe E C. étend

I requièrent la classe D et la classe E et le script échoue. Si la classe C n'hérite pas de A, tout fonctionne correctement. Évidemment, cela a quelque chose à voir avec le fait de demander deux fois la classe A, mais quelqu'un pourrait-il l'expliquer en termes très simples?!?!?

+0

Quel message d'erreur obtenez-vous? – RaYell

Répondre

3

Vous pouvez déclarer chaque classe une seule fois. Si vous avez besoin du fichier où votre classe est définie plus d'une fois, l'analyseur rencontre le class A, fait une recherche interne et des bails: "Hé, vous avez déjà défini cette classe". La solution la plus simple consiste à placer chaque classe dans son propre fichier et à appeler le require_once au lieu de require.

+0

Je pense que ça pourrait être ça ... J'ai toujours utilisé require et non require_once car je ne savais pas vraiment qu'il y avait une différence! Chaque classe est dans son propre fichier. – musoNic80

3

Avez-vous chaque classe dans son propre fichier?

Utilisez-vous require/include au lieu de require_once/include_once? Include_once et require_once ne partagent pas non plus la même table de fichiers inclus, vous devez donc en utiliser un de manière cohérente.

Ou utilisez systématiquement la fonction __autoload dans PHP5.

2

Toutes les fonctions ou classes définies dans les fichiers included sont déclarées dans la portée globale. C'est pourquoi vous obtenez probablement des erreurs de redéclaration. La solution consiste à utiliser require_once ou include_once au lieu de require ou include.

La manière la plus élégante est d'utiliser un __autoload, mais cela nécessite PHP version 5 ou ultérieure. Le seul inconvénient de l'autoloading est que tout échec est une erreur fatale que vous ne pouvez pas gérer vous-même.