2010-10-11 90 views
2

如果我有:PHP:require_once和继承

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

如果我再在不同的文件class control_A extends controller{...}创建,我需要再说一遍require_once("bla.php");,抑或是遗传吗?

如果require_onceclass controller定义内完成,该怎么办?

谢谢!

JDelage

+0

这取决于'bla.php'的作用? – 2010-10-11 15:01:49

回答

6

到目前为止,我们有两个矛盾的,但同样正确的答案=)让我们看看,如果我不能合并两成一个更具体的总答案。

如果任何类需要bla.php中的任何代码或定义,那么在脚本的整个运行时至少需要一次include("bla.php")。如果您以前的代码:

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

是文件controller.php,然后你可以通过以下方式创建control_A

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

这是因为require_once()功能基本上是复制和粘贴文件的内容到该行的脚本。因此,上述将被视为相同的:

<?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{...} 
?> 

正如你所看到的,只是需要controller.php,用于控制必要的定义,现在看到和解析。你可以不是做的是省略controller的声明。这不仅仅是因为你在声明它时需要bla.php,而且你也不能扩展一个尚未声明的类。所以下面的代码:

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

会给你一个错误,因为控制器尚未定义。

但有一点需要考虑 - 因为类controller没有扩展任何其他类,所以不应该有任何外部依赖关系。很有可能无论你在bla.php中做什么,在定义该类之前都必须运行,这是不必要的或者可以重新构造的。在定义controller之前,bla.php究竟做了什么?

0

是的,你这样做。 require_once "foo.php"有效地采用foo.php的内容并将它们粘贴(然后处理所有的 s和include s)。

+0

你的措辞没有意义。你说它处理包含的文件需要/包括但是你也说你需要单独需要文件(你不这样做)。 – 2010-10-11 15:10:24

+0

啊,我在这里看到这个问题。假设他在'foo.php'中定义了'Foo'类,并在该文件中包含了一些库。凭借扩展课程,他不会自动包含该图书馆。但是,因为他包含'foo.php',他确实包含了有问题的库。那有意义吗? – 2010-10-11 16:15:40

2

只要你包含继承的类,它不需要再次需要。

I.e.

class1.php:

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

} 
?> 

class2.php:

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

} 
?>