关于在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并可以从数据库中创建/读取/更新/删除a
Log.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将需要
    require\u一次
    FactoryA.php
  • FactoryA.php
    require_一次
    A.Class.php&Log.php
  • A.Class.php
    require_一次
    Database.php&Log.php
  • Database.php
    require\u一次
    Log.php
另一种方法是使用
\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将需要
    require\u一次
    FactoryA.php
  • FactoryA.php
    require_一次
    A.Class.php&Log.php
  • A.Class.php
    require_一次
    Database.php&Log.php
  • Database.php
    require\u一次
    Log.php
另一种方法是使用
\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、计划任务或命令行运行它。。。在这种情况下,它可以正常工作