PHP:如何自动加载接口和摘要

2024-03-28

我有这个自动装载机要自动加载的类classes最初,但现在我想自动加载interfaces and abstracts以及。

所以我做了以下改变answer https://stackoverflow.com/questions/7924782/autoload-differnece-between-class-and-interface-php,

$reflection = new ReflectionClass($class_name);

# Return boolean if it is an interface.
if ($reflection->isInterface())
{
    $file_name = 'interface_'.strtolower(array_pop($file_pieces)).'.php';
}
else
{
    $file_name = 'class_'.strtolower(array_pop($file_pieces)).'.php';

}

我测试过但是这个自动装载机类根本不加载接口。我错过了什么想法吗?

例如,这是我的界面文件,

interface_methods.php

及其内容,

interface methods 
{
    public function delete();
}

下面是我的全部内容自动装载机 class.

class autoloader
{
    /**
     * Set the property.
     */
    public $directory;
    public $recursive;

    public function __construct($directory, $recursive = array('search' => 'models') ) 
    {
        # Store the data into the property.
        $this->directory = $directory;
        $this->recursive = $recursive;

        # When using spl_autoload_register() with class methods, it might seem that it can use only public methods, though it can use private/protected methods as well, if registered from inside the class:
        spl_autoload_register(array($this,'get_class'));
    }

    private function get_class($class_name)
    {
        # List all the class directories in the array.
        if ($this->recursive)
        {
            $array_directories =  self::get_recursive_directory($this->directory);
        }
        else
        {
            if (is_array($this->directory)) $array_directories =  $this->directory;
            else $array_directories =  array($this->directory);
        }

        # Determine the class is an interface.
        $reflection = new ReflectionClass($class_name);

        $file_pieces = explode('\\', $class_name);

        # Return boolean if it is an interface.
        if ($reflection->isInterface())
        {
            $file_name = 'interface_'.strtolower(array_pop($file_pieces)).'.php';
        }
        else
        {
            $file_name = 'class_'.strtolower(array_pop($file_pieces)).'.php';

        }

        # Loop the array.
        foreach($array_directories as $path_directory)
        {
            if(file_exists($path_directory.$file_name)) 
            {
                include $path_directory.$file_name;
            } 
        }

    }

    public function get_recursive_directory($directory)
    {
        $iterator = new RecursiveIteratorIterator
                    (
                        new RecursiveDirectoryIterator($directory),
                        RecursiveIteratorIterator::CHILD_FIRST
                    );

        # This will hold the result.
        $result = array();

        # Loop the directory contents.
        foreach ($iterator as $path) 
        {

            # If object is a directory and matches the search term ('models')...
            if ($path->isDir() && $path->getBasename() === $this->recursive['search']) 
            {

                # Add it to the result array.
                # Must replace the slash in the class - dunno why!
                $result[] = str_replace('\\', '/', $path).'/';
                //$result[] = (string) $path . '/';

            }

        }

        # Return the result in an array.
        return $result;
    }
}

PHP 对任何类、接口或抽象类没有区别。您定义的自动加载器函数始终获取要自动加载的事物的名称,并且没有任何提示它是哪一个。

因此,您的命名策略无法自动加载,因为您为接口添加了“interface_”前缀,为类添加了“class_”前缀。我个人觉得这样的命名约定相当烦人。

另一方面,您的自动加载机性能完全不佳。它递归地扫描整个目录树只是为了找到一个类!下一堂课必须重新做所有的工作,而没有以前做过的好处!

如果您确实想自己实现,请务必实现 PSR-0 自动加载器(并且不要使用诸如composer http://getcomposer.org为您做这件事)并坚持类和接口的命名方案。

并且请选择一个可区分的类名前缀或命名空间,并作为第一步检查自动加载器内部要加载的类是否具有此前缀。如果没有立即返回。这使您不必旋转硬盘并查看该类的文件名是否存在。

如果前缀不匹配,则不是要加载的“您的”类,因此您的自动加载器不知道如何执行此操作,甚至不应该尝试,但注册的不同自动加载器会知道。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP:如何自动加载接口和摘要 的相关文章

随机推荐

  • 显示具有单个 ID 的多条通知消息

    我有几个同时发生的事件 我需要以串行方式向用户显示多条通知消息 理想的情况是 每条通知消息将轮流显示 持续时间约为 2 秒 我能得到的最接近的是使用多个 id 但是 使用多个 id 会产生我不想要的副作用 最终状态栏上会同时显示多条通知消息
  • 如何在退出时杀死所有子进程?

    当node js进程退出时 如何杀死所有子进程 使用child process spawn生成 我认为唯一的方法是保留对ChildProcess返回的对象spawn 并在退出 master 进程时杀死它 一个小例子 var spawn re
  • 如何动态选择要在 Jenkins 构建中使用的 git 分支

    我正在尝试为 Jenkins 构建服务器创建一个新的项目配置 为了简化我想要做的事情 我将仅使用两个组件来描述问题 组分A 该组件的更改会触发该项目在 CI 服务器上的构建 CI 服务器具有静态配置的分支来监视更改和构建 例如 掌握或开发分
  • x86 中不同数学函数的性能?

    我正在编写 3D 碰撞 想知道基本数学函数 如 sqrt pwr 三角函数 如 sin cos tan arcsin 的性能差异 我听说这取决于许多其他因素 所以我只是想粗略地了解哪一个速度较慢并且需要避免 同时寻找不同的方法来解决问题 我
  • 如何在实体框架中使用数据库优先方法来使用存储库模式

    如何在实体框架中使用数据库优先方法来使用存储库模式 我在浏览互联网上可用的资源时得到了一些想法 但对于实时应用程序 我不确定如何在从数据库优先方法自动生成的类上实现存储库模式 我已经浏览过 SO 中的一些链接 但我没有得到任何明确的想法 我
  • Node.js fs.unlink 函数导致 EPERM 错误

    我在用着fs unlink 删除文件 我收到以下错误 uncaught undefined Error EPERM Operation not permitted Path To File 有人知道为什么会发生这种情况吗 您无法删除不为空的
  • DynamoDB:如何使用查询过滤器检查 MAP 中的条件

    我有一张表 结构如下 当我进行查询时 我希望能够对数据图进行查询过滤 但我不太确定如何设置查询 这是我到目前为止所拥有的 HashMap
  • 如何通过 ASP.NET Core/Razor 单击按钮来运行在 Razor 页面上编写的 C#?

    我想在单击页面上的按钮时执行我直接在 razor 页面上编写的 C 方法 我发现 如果我引用了页面上的按钮 它会在第一次加载时执行该方法 但当我实际单击该按钮时 它不会再次执行 这是代码 Razor 页面 C 参考 functions in
  • Go 1.13 RSS持续增加,疑似清理问题

    我们的一项 Go 服务中的 RSS 不断增加 我们怀疑这是由于 scavenger 没有正确地将内存返回给操作系统 或者操作系统由于使用 MADV FREE 而没有收回内存 通过 pprof 检查 未检测到内存泄漏 我们尝试使用以下简单的
  • Facebook API - 无法获取页面个人资料图像

    我有一个页面无法从中获取公共个人资料图像 为什么会这样 为什么会发生 有问题的页面是 警告 脱衣舞娘的 NSFW 风格图像 真的很抱歉 我只能找到示例 无论如何都不需要查看该页面 https www facebook com pages T
  • Java Applet 不缓存

    我部署的 Java 小程序有问题 该小程序拒绝缓存在 jvm 的 粘性 缓存 或浏览器 中 由于某种原因 每次用户加载该小程序所在的页面时 jvm 都会从服务器重新下载 jar 文件 这会导致长时间延迟 包含该小程序的网页是通过互联网访问的
  • 如何在 Windows 机器上构建或安装 freeglut

    我下载了freeglut http freeglut sourceforge net 我正在阅读安装指示 http freeglut sourceforge net docs install php 我提取了所有文件 我看到一个名为conf
  • 无服务器框架Python lambda直接返回JSON

    我试图找出如何使用无服务器框架直接以 JSON 形式返回响应 这是 AWS 上具有 Lambda 代理集成的功能 全部默认设置 目标是从 python lambda 函数中 HTTP 响应客户端直接获取的是 JSON 对象 而不是 JSON
  • 在javascript中访问数组中的数组

    我收到一个 JSON 回复 如下所示 order id 12 customer user user status Pending date added 02 09 2012 total 500 00 action text View hre
  • 如何使用回调来保证顺序执行?

    我正在尝试围绕回调进行思考 但我不明白回调是如何进行的保证将执行一条语句之后 就时间而言 另一个声明需要一个unknown多少时间 我不在乎承诺 等待 异步等但只是我想学习的简单回调 例如下面的例子 我的方法将在未知时间事件发生之前执行回调
  • 从网页中的 servlet 读取 Quicktime 电影?

    我有一个 Servlet 它通过从服务器读取文件来构造对媒体文件请求的响应 File uploadFile new File C TEMP movie mov FileInputStream in new FileInputStream u
  • 如何创建使用 ng-model 的角度日期选择器指令

    我为 jQuery UI 日期选择器创建了一个角度指令 问题是 当选择日期时 指令不会更新输入的 ng model 知道为什么吗 http jsbin com ufoqan 1 edit http jsbin com ufoqan 1 ed
  • 最小化/小型化可可 NSWindow 没有标题栏

    我被困住了 显然 因为我在这里发布了一个问题 我为我的 OS X cocoa 应用程序构建了自己的自定义窗口控件 关闭按钮效果很好 没问题 当我禁用标题栏时 最小化按钮根本不起作用 因此 当标题栏像上图一样打开并且我点击此方法时 最小化效果
  • 查询谷歌电子表格的特定工作表

    我正在尝试使用谷歌电子表格作为临时数据库 我已按照以下教程中的说明进行操作 一切正常 http www alatechsource org blog 2012 05 using the google spreadsheets data ap
  • PHP:如何自动加载接口和摘要

    我有这个自动装载机要自动加载的类classes最初 但现在我想自动加载interfaces and abstracts以及 所以我做了以下改变answer https stackoverflow com questions 7924782