我有这个:
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
的所有文件吗?或者我是否在课堂上这样做?
答案 0 :(得分:3)
您可以使用自动加载。
这意味着php it self会在你需要的时候加载这个类。您可以这样定义:
function __autoload($class_name) {
include 'class/' . $class_name . '.php';
}
如果您现在尝试创建一个新对象,例如A,并且尚未加载A,则将调用自动加载,并且第一个参数将是要查找的类。
$a = new A();
答案 1 :(得分:2)
如果您不使用自动加载器(see Autoloading CLasses),则必须手动将所有必需文件包含在所有相关文件中。通常建议所有文件管理所有自己的依赖项。
如果我理解你的依赖关系,这将是:
require_once
FactoryA.php require_once
A.Class.php& Log.php require_once
Database.php& Log.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包含在索引文件中即可。