当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在PHP中处理包含所需的类》经验,为你挑选了1个好方法。

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

目前,我只是使用include_once来包含我直接访问的类.其中每一个都是include_once他们访问的类.

我已经研究过使用这个__autoload函数,但是如果你计划在目录树中组织你的类文件,那么hat似乎不会很好用.如果你这样做了,看起来你最终会走到目录树,直到你找到了你正在寻找的课程. 另外,我不确定这会如何影响不同命名空间中具有相同名称的类.

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

或者PHP不适合具有许多不同对象的" 企业 "类型应用程序,它们都位于可以位于许多不同目录中的单独文件中.



1> Michał Rudni..:

我的应用程序我通常有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.您也可以在找不到类时从autoload函数运行autobuilder,但这可能会使您的程序进入无限循环.

序列化数组非常快.

@JasonMichael:PHP 4已经死了.克服它.

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有