0

我有这个:

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所有文件都 来自 index.php吗?还是我在课堂上做?

4

3 回答 3

3

你可以使用自动加载。

这意味着如果您需要,php it self 将加载该类。你可以这样定义它:

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

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

$a = new A();

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

于 2013-09-12T15:24:57.543 回答
2

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

如果我了解您的依赖关系,它将如下所示:

  • Index.php将需要require_once FactoryA.php
  • FactoryA.phprequire_once A.Class.php & Log.php
  • A.Class.phprequire_onceDatabase.php & Log.php
  • Database.phprequire_onceLog.php

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

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

但是,spl_autoload_register() 为自动加载类提供了更灵活的替代方案。出于这个原因,不鼓励使用 __autoload() 并且将来可能会弃用或删除。请参阅PHP 参考

我们建议您查看PSR-0 标准,您可以只使用 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 参考项目来演示、检查bubba-h57/AutoLoading并从命令行运行它。您应该会看到如下结果:

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

请参阅为什么 PHP 的自动加载功能在 CLI 模式下不起作用?有关从命令行 (cli) 脚本中使用自动加载器的讨论​​。

于 2013-09-12T15:28:10.073 回答
0

模块化通常是好的,但只有当一切都一致时。我不确定你为什么想要一个单独的日志文件?

我认为您的文件不是真正有组织的 ATM,您是否考虑过使用 Laravel/CodeIgniter 之类的框架?

否则,在包含时,我只会说将相关文件相互包含,例如让 FactoryA 包含类文件,然后将您的 FactoryA 包含到您的索引文件中等等。

于 2013-09-12T15:25:48.757 回答