关于在php中包含一次的混淆
我有这个:关于在php中包含一次的混淆,php,include,Php,Include,我有这个: class/ |-- A.Class.php |-- FactoryA.php |-- Database.php |-- Log.php index.php 其中FactoryA.php是一个Factory类,它创建obj a并可以从数据库中创建/读取/更新/删除aLog.php是一个将日志发送到文本文件Log.txt的类 FactoryA需要A.Class(创建实例)和数据库。所有3个类都需要Log.php(用于调试)。php所做的一切就是创建一个
class/
|-- A.Class.php
|-- FactoryA.php
|-- Database.php
|-- Log.php
index.php
其中FactoryA.php是一个Factory
类,它创建obj a并可以从数据库中创建/读取/更新/删除aLog.php
是一个将日志发送到文本文件Log.txt
的类
FactoryA
需要A.Class
(创建实例)和数据库
。所有3个类都需要Log.php
(用于调试)。php所做的一切就是创建一个FactoryA
实例
我不知道我应该把包含语句放在哪里。我是否包含index.php中的所有文件?或者我在课堂上做吗?你可以使用自动加载 这意味着,如果需要,php it本身将加载该类。您可以这样定义它:
function __autoload($class_name) {
include 'class/' . $class_name . '.php';
}
如果您现在尝试创建一个新对象,例如a,但a尚未加载,将调用autoload,并且第一个参数将是要查找的类
$a = new A();
您可以使用自动加载 这意味着,如果需要,php it本身将加载该类。您可以这样定义它:
function __autoload($class_name) {
include 'class/' . $class_name . '.php';
}
如果您现在尝试创建一个新对象,例如a,但a尚未加载,将调用autoload,并且第一个参数将是要查找的类
$a = new A();
模块化通常是好的,但只有在所有内容都一致的情况下。我不知道你为什么想要一个单独的日志文件 我认为您的文件不是真正有组织的ATM,您是否考虑过使用像Laravel/CodeIgniter这样的框架
否则,在包含时,我只会说将相关文件包含到彼此中,比如让FactoryA包含类文件,然后将FactoryA包含到索引文件中等等。模块化通常是好的,但只有在所有内容都一致的情况下。我不知道你为什么想要一个单独的日志文件 我认为您的文件不是真正有组织的ATM,您是否考虑过使用像Laravel/CodeIgniter这样的框架
否则,在包含时,我只会说将相关文件包含到彼此中,比如让FactoryA包含类文件,然后将FactoryA包含到索引文件中等等。如果不使用自动加载程序(),则必须手动将所有必要的文件包含在所有依赖文件中。通常建议所有文件管理其自身的所有依赖项 如果我了解您的依赖关系,这将类似于:
- Index.php将需要
FactoryA.phprequire\u一次
- FactoryA.php将
A.Class.php&Log.phprequire_一次
- A.Class.php将
Database.php&Log.phprequire_一次
- Database.php将
Log.phprequire\u一次
\uuu autoload
,让它根据需要为您获取所需的文件。因此,在你的
function __autoload($class_name) {
include './class/' . $class_name . '.php';
}
$a = new A();
但是,spl\u autoload\u register()为自动加载类提供了更灵活的选择。因此,不鼓励使用_autoload(),将来可能会被弃用或删除。请参阅
我们建议你检查一下,你可能只是要点
您将需要重命名类以遵循名称空间和路径标准,然后您可以执行以下操作:
//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参考项目,用于从命令行演示、签出和运行它。您应该看到如下结果:
[cinamon-vm] AutoLoading> php index.php
From the factory!
From the AClass!
From the Database!
Pure win!
有关从命令行(cli)脚本使用自动加载程序的讨论,请参阅。如果不使用自动加载程序(),则必须手动将所有必需的文件包含在所有从属文件中。通常建议所有文件管理其自身的所有依赖项 如果我了解您的依赖关系,这将类似于:
- Index.php将需要
FactoryA.phprequire\u一次
- FactoryA.php将
A.Class.php&Log.phprequire_一次
- A.Class.php将
Database.php&Log.phprequire_一次
- Database.php将
Log.phprequire\u一次
\uuu autoload
,让它根据需要为您获取所需的文件。因此,在你的
function __autoload($class_name) {
include './class/' . $class_name . '.php';
}
$a = new A();
但是,spl\u autoload\u register()为自动加载类提供了更灵活的选择。因此,不鼓励使用_autoload(),将来可能会被弃用或删除。请参阅
我们建议你检查一下,你可能只是要点
您将需要重命名类以遵循名称空间和路径标准,然后您可以执行以下操作:
//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参考项目,用于从命令行演示、签出和运行它。您应该看到如下结果:
[cinamon-vm] AutoLoading> php index.php
From the factory!
From the AClass!
From the Database!
Pure win!
有关从命令行(cli)脚本使用自动加载程序的讨论,请参阅。但我被告知,如果PHP在CLIYes中运行,则自动加载不可用。没错。如果在CLI中运行php,则不能使用自动加载。@实际上,只有在CLI交互模式下使用php时,自动加载才可用。我假设您不是在交互模式下使用CLI,而是作为cron、计划任务或命令行运行它。。。在这种情况下,它可以正常工作。spl_autoload_register()为自动加载类提供了更灵活的选择。出于这个原因,不鼓励使用_autoload(),将来可能会被弃用或删除。但我被告知,如果PHP在CLIYes中运行,则自动加载不可用。没错。如果在CLI中运行php,则不能使用自动加载。@实际上,只有在CLI交互模式下使用php时,自动加载才可用。我假设您不是在交互模式下使用CLI,而是作为cron、计划任务或命令行运行它。。。在这种情况下,它可以正常工作