php - 如何在 PHP 中处理包含所需的类

标签 php class include autoload

我想知道处理必须在我的 PHP 脚本中“包含”这么多文件以确保我的脚本可以访问我需要使用的所有类的问题的最佳实践是什么。

目前,我正在使用 include_once包括我直接访问的类。其中每一个都会include_once 他们访问的类。

我研究过使用 __autoload 函数,但如果您计划将类文件组织在目录树中,那么 hat 似乎不太适用。如果这样做,看起来您最终会遍历目录树,直到找到您要查找的类。 此外,我不确定这对不同命名空间中具有相同名称的类有何影响。

有没有更简单的方法来处理这个问题?

或者 PHP 是否只是不适合“企业”类型的应用程序,这些应用程序具有许多不同的对象,所有这些对象都位于单独的文件中,这些文件可以位于许多不同的目录中。

最佳答案

在我的应用程序中,我通常有包含所有核心类(即框架和附带库)的 setup.php 文件。我的自定义类是使用目录布局图辅助的自动加载器加载的。

每次添加新类时,我都会运行命令行生成器脚本,扫描整个目录树以搜索模型类,然后构建关联数组,其中类名作为键,路径作为值。然后,__autoload 函数在该数组中查找类名并获取包含路径。这是代码:

autobuild.php

define('MAP', 'var/cache/autoload.map');
error_reporting(E_ALL);
require 'setup.php';
print(buildAutoloaderMap() . " classes mapped\n");

function buildAutoloaderMap() {
    $dirs = array('lib', 'view', 'model');
    $cache = array();
    $n = 0;
    foreach ($dirs as $dir) {
        foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)) as $entry) {
            $fn = $entry->getFilename();
            if (!preg_match('/\.class\.php$/', $fn))
                continue;
            $c = str_replace('.class.php', '', $fn);
            if (!class_exists($c)) {
                $cache[$c] = ($pn = $entry->getPathname());
                ++$n;
            }
        }
    }
    ksort($cache);
    file_put_contents(MAP, serialize($cache));
    return $n;
}

autoload.php

define('MAP', 'var/cache/autoload.map');

function __autoload($className) {
    static $map;
    $map or ($map = unserialize(file_get_contents(MAP)));
    $fn = array_key_exists($className, $map) ? $map[$className] : null;
    if ($fn and file_exists($fn)) {
        include $fn;
        unset($map[$className]);
    }
}

请注意,文件命名约定必须是 [class_name].class.php。更改目录类将在 autobuild.php 中查找。您也可以在找不到类时从自动加载函数运行自动构建器,但这可能会使您的程序陷入无限循环。

序列化数组非常快。

@JasonMichael:PHP 4 已死。克服它。

关于php - 如何在 PHP 中处理包含所需的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23802/

相关文章:

php 包含到外部 url

php - 弃用 Twig 过滤器,改用 Twig_SimpleFilter

php - Web 服务器上使用的 file_put_contents 编码?

php - 如何在多个页面上将页脚位置保持在内容下方

C++ 跨文件共享变量的良好做法?

javascript - C# 获取设置 javascript 等效项

php - 在数据集中找到最真实的市场平均价格的算法

php - WordPress 中的 Ajax 和 php 删除错误

class - scala 案例类问题

JavaScript:尝试使用由于某种原因无法运行的类函数