关于php中include_once的困惑

时间:2013-09-12 15:21:19

标签: php include

我有这个:

class/
    |-- A.Class.php
    |-- FactoryA.php
    |-- Database.php
    |-- Log.php
index.php

其中FactoryA.php是一个Factory类,它创建obj A并可以从数据库创建/读取/更新/删除A. Log.php是一个将日志发送到文本文件log.txt的类。

FactoryA需要A.Class(创建实例)和Database。所有3个类都需要Log.php(用于调试目的)。所有index.php都是为了创建一个FactoryA实例。

我不知道应该在哪里放置include语句。我是include来自 index.php的所有文件吗?或者我是否在课堂上这样做?

3 个答案:

答案 0 :(得分:3)

您可以使用自动加载。

这意味着php it self会在你需要的时候加载这个类。您可以这样定义:

function __autoload($class_name) {
    include 'class/' . $class_name . '.php';
}

如果您现在尝试创建一个新对象,例如A,并且尚未加载A,则将调用自动加载,并且第一个参数将是要查找的类。

$a = new A();

http://www.php.net/manual/language.oop5.autoload.php

答案 1 :(得分:2)

如果您不使用自动加载器(see Autoloading CLasses),则必须手动将所有必需文件包含在所有相关文件中。通常建议所有文件管理所有自己的依赖项。

如果我理解你的依赖关系,这将是:

  • Index.php 需要require_once FactoryA.php
  • FactoryA.php require_once A.Class.php& Log.php
  • A.Class.php require_once Database.php& Log.php
  • Database.php require_once Log.php

另一种方法是使用__autoload并让它根据需要为您提取所需的文件。因此,在你的

function __autoload($class_name) {
    include './class/' . $class_name . '.php';
}
$a = new A();

但是, spl_autoload_register()为自动加载类提供了更灵活的替代方法。因此,不鼓励使用__autoload(),将来可能会弃用或删除。请参阅the PHP Ref

我们建议你查看PSR-0 standard,你可能只是use the SplClassLoader.php要点。

您需要重命名您的类以遵循命名空间和路径标准,但是您可以执行以下操作:

//This is the only file you need to require
require_once('/path/to/SplClassLoader.php');
$classLoader = new SplClassLoader('Class', './class');
$classLoader->register();
$a = new A();

我编写了一个小的CLI参考项目来演示,checkout bubba-h57/AutoLoading并从命令行运行它。您应该看到如下结果:

[cinamon-vm] AutoLoading> php index.php 
From the factory!
From the AClass!
From the Database!
Pure win!

有关从命令行(cli)脚本使用自动加载器的讨论​​,请参阅Why doesn't PHP's Autoload feature work in CLI mode?

答案 2 :(得分:0)

模块化通常很好,但只有在一切都连贯的时候。我不确定你为什么要有一个单独的日志文件?

我认为您的文件并非真正有组织的ATM,您是否考虑使用像Laravel / CodeIgniter这样的框架?

否则,在包含时,我只想说相关文件相互包含,比如make FactoryA包含类文件,然后只需将FactoryA包含在索引文件中即可。