PHP:require_once 和继承

Posted

技术标签:

【中文标题】PHP:require_once 和继承【英文标题】:PHP: require_once and inheritance 【发布时间】:2011-04-23 20:53:45 【问题描述】:

如果我有:

require_once("bla.php");
class controller.....

如果我随后在另一个文件中创建class control_A extends controller...,我需要再次说require_once("bla.php");,还是继承?

如果require_onceclass controller 定义内完成会怎样?

【问题讨论】:

这取决于bla.php 做什么? 【参考方案1】:

到目前为止,我们有两个相互矛盾但同样正确的答案 =) 让我们看看我是否不能将两者结合成一个更具体的总答案。

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

require_once("bla.php");
class controller.....

在文件controller.php中,那么你可以通过以下方式创建control_A

require_once("controller.php");
class control_A extends controller...

这是因为require_once() 函数本质上是将文件的内容复制并粘贴到该行的脚本中。因此,上面的内容将被视为等同于:

/* 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,而且您不能扩展尚未声明的类。所以下面的代码:

class control_A extends controller...

由于控制器尚未定义,因此会给您一个错误。

然而,需要考虑的一件事是——因为类controller 不扩展任何其他类,它不应该有任何外部依赖项。很有可能您在bla.php 中所做的任何必须在定义类之前运行的操作要么是不必要的,要么是可以重组的。 bla.php 在定义controller 之前需要做什么?

【讨论】:

【参考方案2】:

只要包含了继承的类,就不需要再要求了。

class1.php:

require_once("tools.php");
class class1 


class2.php:

require_once("class1.php");
class class2 extends class1 


【讨论】:

以上是关于PHP:require_once 和继承的主要内容,如果未能解决你的问题,请参考以下文章

完整REST JSON MySQL管理类

php 运行的时候出现的错误

php中的require_once

PHP奇怪的洗牌与require_once和字符串数组

require与require_once有啥区别?PHP

require_once 给出警告和致命错误