2010-10-11 29 views
2

Si je:PHP: require_once et l'héritage

<?php 
require_once("bla.php"); 
class controller{.....} 
php> 

Si je crée alors dans un autre fichier class control_A extends controller{...}, dois-je dire encore une fois require_once("bla.php");, ou est-il héréditaire?

Et si le require_once est fait dans la définition class controller?

Merci!

JDelage

+0

Cela dépend de ce que 'bla.php' fait? –

Répondre

6

Jusqu'à présent, nous avons deux contredisant, mais des réponses tout aussi correctes =) Voyons voir si je ne peux pas combiner les deux dans une réponse totale plus spécifique.

Si une classe nécessite un code ou des définitions dans bla.php, vous devrez alors include("bla.php") au moins une fois pendant toute la durée d'exécution de votre script. Si votre code précédent:

<?php 
require_once("bla.php"); 
class controller{.....} 
php> 

est dans le fichier controller.php alors vous pouvez créer control_A de la manière suivante:

<?php 
require_once("controller.php"); 
class control_A extends controller{...} 
?> 

En effet, la fonction require_once() essentiellement des copies et colle le contenu du fichier dans le script à cette ligne. Par conséquent, ce qui précède sera considéré équivalent à ceci:

<?php 
/* INSERTED FROM controller.php */ 
/* INSERTED FROM bla.php */ 
necessary definitions for controller 
/* END bla.php */ 
class controller{.....} 
/* END controller.php */ 
class control_A extends controller{...} 
?> 

Comme vous pouvez le voir, tout en exigeant controller.php, les définitions nécessaires pour contrôleur sont vu et analysé. Ce que vous pouvez pas faire est d'omettre la déclaration de controller. Ce n'est pas seulement parce que vous avez demandé bla.php en le déclarant, mais vous ne pouvez pas non plus étendre une classe qui n'a pas encore été déclarée. Donc, le code suivant:

<?php 
class control_A extends controller{...} 
?> 

va vous donner une erreur puisque le contrôleur n'a pas été défini. Une chose à prendre en compte, cependant - puisque la classe controller ne s'étend à aucune autre classe, elle ne devrait pas avoir de dépendances externes. Il y a de fortes chances que tout ce que vous faites en bla.php qui doit être exécuté avant de définir la classe soit est inutile, soit peut être restructuré. Quel est exactement ce que vous avez besoin bla.php avant de définir controller?

0

Oui, c'est le cas. require_once "foo.php" prend effectivement le contenu de foo.php et les colle dans (puis traite tous sesrequire s et include s).

+0

Votre formulation n'a pas de sens. Vous dites qu'il traite les fichiers inclus nécessite/inclut, mais vous dites aussi que vous devez exiger le fichier séparément (ce qui n'est pas le cas). –

+0

Ah, je vois le problème ici. Dites qu'il définit 'class Foo' dans' foo.php', et 'includes' une bibliothèque dans ce fichier. En vertu de l'extension de la classe, il n'inclura pas automatiquement cette bibliothèque. Cependant, parce qu'il inclut 'foo.php', il inclut la bibliothèque en question. Cela a-t-il du sens? –

2

Tant que vous incluez la classe héritée, elle n'a pas besoin de l'être à nouveau.

I.e.

class1.php:

<?php 
require_once("tools.php"); 
class class1 { 

} 
?> 

class2.php:

<?php 
require_once("class1.php"); 
class class2 extends class1 { 

} 
?>