PHP 类自动加载

2024-02-01

我有一个“简单框架”,其主要实例是 $app.现在,实现自动加载器的最佳方法是什么(不使用 Composer)。我需要的是有一个处理所有自动加载的类(支持各种名称空间)。我有一些方法/困境。

起初我认为我应该创建一个处理所有事情的“静态”类。但后来我想到了一些事情。如果我在实例化 $app (包含所有路径)之前使用自动加载器,我需要在 $app 之外定义路径。而且,如果在自动加载类时发生错误,我将无法正确处理该错误(错误处理程序位于 $app 内部,并在之后实例化)。

然后我想到了依赖注入,使自动加载器成为应用程序内的对象。这将解决错误处理问题,并且不需要我对路径进行硬编码或将它们设为全局变量。但在实例化自动加载器之前,我还必须加载许多类(包括 $app)。

但实际上,由于这个问题,我陷入了痛苦的世界,我真的不知道从哪里开始,有一些我应该考虑的建议吗?您能解释一下我应该使用哪种方法以及为什么吗?

Thanks.


根据我在这个问题中得到的提示,我进行了更多搜索,并从哪里找到了很好的学习资源。

什么是自动加载?

自动加载基本上是程序找到未知类名并尝试在未定义类名的情况下加载它的过程。如果没有自动加载器,这种行为将导致致命错误(至少对于 PHP 而言)。使用自动加载器,情况会发生变化,程序将尝试加载类名,而不知道在哪里可以找到它,但依赖于为此目的而考虑的函数或类,这些函数/类被调用自动装载机.

__autoload() 与 spl_autoload_register()

在 PHP 中,我们有两种不同的方法来实现自动加载(您可能会发现从以下位置读取它很有用)PHP 的网站 http://www.php.net/manual/en/language.oop5.autoload.php.)。第一个是旧的__自动加载() http://www.php.net/manual/en/function.autoload.php,最新的是spl_autoload_register() http://www.php.net/manual/en/function.spl-autoload-register.php。但到底有什么区别呢?基本上 __autoload() 是独一无二的,拥有多个自动加载器会给你带来很多麻烦,并且会让你解决一个可以通过使用最新的 spl_autoload_* 函数轻松避免的问题。spl_autoload_register()另一方面,通过将多个自动加载器放在堆栈中,允许程序拥有多个自动加载器,这样整个系统变得更加灵活且复杂性大大降低(为不同目的使用单个自动加载器会导致拥有处理许多请求的大型独特功能,这样你的代码可维护性和可重用性就会减少)。Warning:使用 spl_autoload_register() 会覆盖 __autoload(),所以要小心。

编码标准(PHP):PSR-0 与 PSR-4

首先我们要说的是PSR-4 http://www.php-fig.org/psr/psr-4/是较新的,它被认为是一个改进PSR-0 http://www.php-fig.org/psr/psr-0/,但不是强制性的,您必须使用 4 而不是 0,如标准 (PSR-4) 所述:

它具有完全的互操作性,并且可以与任何其他自动加载规范(包括 PSR-0)一起使用。

那么为什么我应该使用其中之一而不是另一个呢?

现在这取决于您,但作为建议,PSR-4 解决了 PSR-0 的“嵌套”问题,因此您应该使用前者。假设我有一个应用程序,并且我的应用程序依赖于外部组件,PSR-0 遵循以下语法:

\vendor\(sub_namespaces\)class_name

其中 sub_namespaces 可能不存在。但这转化为硬盘驱动器上的完全限定路径:

path/to/project/vendor/sub/namespaces/class/name.php

现在假设我想在我的应用程序中包含一个名为 YourLibrary 的库

\YourDeveloper\YourLibrary\YourFunction

这将翻译为

/path/to/project/YourDeveloper/YourLibrary/YourFunction

问题是,如果我想将该库放在我的子文件夹中该怎么办:

/path/to/project/vendor/vendor_name

PSR-0 是绝对的,您不能仅修改名称空间来控制此行为(这会很愚蠢并且需要太多时间),因此它将转换为:

/path/to/project/vendor/YourDeveloper/src/YourDeveloper/YourLibrary/YourFunction

这不是非常嵌套和多余吗?好吧,使用 PSR-4 你可以避免这种情况并将其转化为

/path/to/project/vendor/YourDeveloper/YourLibrary/YourFunction

无需更改命名空间或自动加载器。这基本上就是 PSR-4 的工作原理。这个解释很简短,但它让您大致了解 PSR-4 为何诞生以及为什么应该使用它。如果您需要更充分的解释,您可以去阅读 PSR-0/4 规范,或者您可以阅读this http://www.sitepoint.com/battle-autoloaders-psr-0-vs-psr-4/sitepoint 上的漂亮文章。

我真的应该关心标准吗?

如果您已经在编程世界中呆了足够长的时间,您可能最终不会问这样的问题。但如果你是,你可能是一个新程序员,或者你成为程序员的时间还不够长,这就是你应该阅读这个答案的原因。 在 IT 世界中,尤其是在编程领域,标准几乎就是一切。如果我们不遵循标准,我们的计算机上甚至可能没有视频。如果任何人都遵循自己的标准,一切都会显得混乱,在这种情况下,自动装弹机就会变得个人化;因此,您最终将拥有许多自动加载器,而不是一个简单的自动加载器,每个标准一个,这使得您的应用程序更难以维护和调试(因为每个人都可以使erors).

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

PHP 类自动加载 的相关文章

  • Symfony2 Twig 扩展

    我在实现树枝扩展时遇到一些问题 我需要创建自己的过滤器 子过滤器 所以我想到了使用twig扩展 我在 MyApp Bundle WebsiteBundle 和文件上创建了一个名为 Extension 的文件夹 网站扩展 php namesp
  • 自定义 WP 主题时,我应该将导航栏放在“”标签之前还是之后?

    我正在通过制作子主题来自定义 WP 主题 我将 Bootstrap 中的导航栏放入子主题目录中的 header php 文件中 但是 我不确定在哪里放置导航栏代码 我可以把它都放在前面and之后标记成功 例如 无论我选择哪一个 导航栏都显示
  • 使用 php 获取当前月份的最后 3 个月

    我想获取当前月份最近 3 个月的名称 例如当前月份是八月 所以 我想要六月 七月 八月这样的数据 我已经尝试过这段代码echo date F strtotime 3 months 它只返回六月 如何使用 php 获取当前月份的最后 3 个月
  • 通过 __get() 通过引用返回 null

    快速规格 PHP 5 3 error reporting 1 the highest 我正在使用 get 通过引用技巧神奇地访问对象中任意深度的数组元素 快速示例 public function get key return isset t
  • facebook php - 如何获取专辑封面照片

    我需要使用 PHP SDK Facebook 获取专辑封面照片 我尝试 https graph facebook com ALBUM ID picture type album 但我得到默认图像 例如 获取用户 https graph fa
  • PHP 开发相当于 Mongrel/Webrick 吗?

    PHP 开发中是否有与 Rails 开发期间使用 Mongrel Webrick 等效的方法 我通常在端口 3000 上使用 Mongrel 在开发过程中为我的 Rails 应用程序提供服务 我从事 PHP 开发已经有几年了 据我所知 方法
  • zip 文件的校验和

    我目前正在开发一个工具 它上传一组文件 然后使用 md5 校验和将文件与上一批上传的文件进行比较 并告诉您哪些文件已更改 对于常规文件 这工作正常 但某些上传的文件是 zip 存档 即使其中的文件相同 它们几乎总是会发生变化 有没有一种方法
  • 负载平衡集群中的 PHP 会话 - 如何?

    好的 我得到了这个完全罕见的负载平衡 PHP 网站的独特场景 令人遗憾的是 它过去没有进行负载平衡 现在我们开始遇到问题 目前唯一的问题是 PHP 会话 当然 一开始没有人想到这个问题 因此 PHP 会话配置保留为默认值 因此 两台服务器都
  • 通过 facebook graph API 检索 facebook 用户的邮政编码

    我正在尝试使用 facebook graph API 检索用户的邮政编码 我正在使用以下代码 代码在php ini中 facebook new Facebook array appId gt APP ID secret gt APP SEC
  • 如何在类似 MVC 的页面中加载基于漂亮 URL 的类?

    我想请教一些关于如何解决这个问题的提示 我正在尝试构建自己的 MVC 网站 我了解了 URL 的基础知识 http example com blog cosplay cosplayer expo today 博客 gt 控制器cosplay
  • 如何在 PHP 中使用 cURL 发出同时包含 GET 和 POST 参数的请求?

    其他人已经问过如何从 perl java bash 等执行此操作 但我需要在 PHP 中执行此操作 并且我没有看到任何已提出的专门与 PHP 相关的问题 或包含 PHP 的答案 My code ch curl init url curl s
  • Magento - 检查 cms 页面

    我想通过 php 检查页面是否是 Magento 中的 cms page 我需要不同的 cms 页面面包屑 所以我尝试在一个条件下做到这一点 但我不知道如何或在哪里查看 到目前为止 这是我的 breadcrumbs phtml p some
  • 如何在 OS X 上使用 OpenSSL 1.0.1 编译 PHP 5.5.19

    我已经安装了 OpenSSL 1 0 1j usr local ssl现在我尝试使用此版本的 OpenSSL 编译 PHP 5 5 19 这是我的配置过程 export CFLAGS arch x86 64 export CXXFLAGS
  • 如何仅使用 PHP5 RecursiveDirectoryIterator 类递归显示具有特定文件类型的文件夹和子文件夹

    您好 我正在尝试使用 FilterIterator 上的扩展来获取 RecursiveDirectoryIterator 类 但由于某种原因 它仅在根目录上进行迭代 我的代码是这样的 class fileTypeFilter extends
  • PHP 数组通过 JSON 转为 jquery 数组

    我有点困惑为什么以下不起作用 get php
  • 检查条件并通过 Zend 中的 Regex 识别 url 中的模式

    我正在实现 Zend Regex 路由 并且必须对 url 执行多次检查 例如 如果这是我的网址 http localhost application public index php module controller action 这是
  • 从支付网关重定向回时用户会话丢失

    我已将 Cyber source 配置为我的支付网关 我能够导航到 cybersource 并进行付款 并能够成功重定向回该网站 我也可以取消付款并重定向回我的网站 我收到来自支付网关的响应 但是 用户在从支付网关重定向回来时会被注销 我正
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 如何使用 PHP 对字符串进行 rot13 处理?

    我有一个很大的 php 代码 我想手动对其进行编码和解码 我的问题是 php 代码里面有很多单引号和双引号 因此我在使用时出现错误str rot13 功能如下 那么正确的语法是什么以及如何使用下面的函数进行编码 str rot13 That
  • 检查 $_POST 数据

    我正在对表单进行一些垃圾邮件检查 下面的代码在我的本地主机上正常工作 如果为 true 则重定向到 google com 但是 当它在生产服务器上时却不起作用 执行脚本的其余部分并且不重定向到 Google com if POST SERV

随机推荐