在PHP中使用'Include'

时间:2014-06-20 07:57:43

标签: php

关于我的问题的简要背景:

我将开始一个具有各种功能的新项目。我需要组织基于模块的功能。例如,成员相关函数进入member.php中的成员类,而库相关函数进入gallery.php中的库类。这些文件将位于文件夹root/modules/中。此文件夹下将有许多文件代表每个模块。

我将使用htaccess将任何请求重定向到index.php,此文件将执行显示页面所需的所有操作。

基于上面的内容(重定向并使用单个文件来处理所有请求)我将使用PHP include函数来包含所有模块。

我不确定是否包含所有模块会导致任何问题。

需要建议:

  • 是否包含所有模块会导致任何相关问题 速度等
  • 是否有任何建议/替代方案来包含模块

1 个答案:

答案 0 :(得分:1)

使用SPL-Autoloader

spl_autoload_register()个功能允许您指定自定义自动加载功能。从PHP 5.3.0开始,您甚至可以指定一个闭包。

使用自动加载器的一个很酷的事情是,它会按需加载所请求的文件,因此您不会有任何开销,包括您请求中的所有文件。

这意味着当一个类因为找不到而无法实例化而不是抛出错误时,它会激活你的自动加载函数并传递所请求的类。然后你的自动加载器当然需要加载正确的文件。

<强>示例

/autoloadsample.php

<?php

spl_autoload_register(function($class){

    include 'classes/' . $class . '.php';

});

$user = new User();

$user->test();

/classes/User.php

<?php

class User {

    public function test()
    {
        echo "Hello World";
    }

}

如您所见,我们未手动包含 /classes/User.php 文件。仍然一切都会在这里工作。

使用Composer

尽管SPL-Autoloader适用于小型项目,但它不一定是最佳解决方案。如果您有一个复杂的项目结构,则需要关心您要加载的文件在整个项目中的位置。

幸运的是我们得到了Composer。它是一个整洁的PHP包/依赖项管理器,它还为您提供了一个自动加载器。

一旦你安装了作曲家,就很容易引导自动加载。

在项目根目录中创建composer.json

{
    "autoload": {
        "classmap": [
            "ProjectDomain"
        ]
    }
}

这只是一个普通的旧json文件。 classmap数组采用您想要自动加载的目录字符串。

然后使用命令行切换到项目工作目录和

composer installcomposer.phar install(如果您尚未全局安装作曲家)

Composer将为您创建一个vendor/目录,该目录通常包含您在composer.json中所需的依赖项,但由于我们不需要任何依赖项,我们将跳过该目录。

在该目录中,您将找到一个autoload.php文件,您现在可以从前端控制器请求该文件。

index.php

<?php

include 'vendor/autoload.php';

$user = new User();

$user->test();

Composer还支持PSR-X自动加载。这样你就可以使用命名空间类,而composer将处理所有的自动加载。例如,这可能是这样的。

composer.json

{
    "autoload": {
        "psr-4": {
            "Project\\": "ProjectDomain"
        }
    }
}

ProjectDomain / user.php的

<?php namespace Project;

class User {

    public function test()
    {
        echo "Hello World!";
    }

}

的index.php

<?php

include 'vendor/autoload.php';

$user = new Project\User();

$user->test();

每当您对composer.json文件进行与自动加载相关的更改时,请务必运行composer dump-autoload