根据我在这个问题中得到的提示,我进行了更多搜索,找到了可以学习的好资源。
什么是自动加载?
自动加载基本上是程序找到未知类名并尝试在未定义类名的情况下加载它的过程。如果没有自动加载器,此行为将导致致命错误(至少对于 PHP)。使用自动加载器,情况会发生变化,程序将尝试加载类名,但不知道在哪里可以找到它,但依赖于为此目的考虑的函数或类,这些函数/类称为自动加载器。
__autoload() 与 spl_autoload_register()
在 PHP 中,我们有两种不同的方式来实现自动加载(您可能会发现从PHP's site 阅读它很有用。)。第一个是旧的__autoload(),最新的是spl_autoload_register()。但究竟有什么区别?基本上 __autoload() 是独一无二的,拥有多个自动加载器会给你带来很多麻烦,并且会让你解决一个可以通过使用最新的 spl_autoload_* 函数轻松避免的问题。另一方面,spl_autoload_register() 允许程序通过将多个 Autoloaders 放入堆栈中来拥有多个 Autoloader,这样整个系统变得更加灵活且简单得多(具有单个 Autoloader 用于不同目的的结果在拥有处理许多请求的大型独特函数中,这样您的代码可维护性和可重用性就会降低)。
警告:使用 spl_autoload_register() 会覆盖 __autoload(),所以要小心。
编码标准(PHP 中):PSR-0 与 PSR-4
首先让我们说PSR-4 较新,它被认为是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 规范或者你可以阅读thissitepoint 上的漂亮文章。
我真的应该关心标准吗?
如果您已经在编程领域工作了足够长的时间,您可能最终不会问这样的问题。但如果你是,你可能是一个新程序员,或者你做程序员的时间不够长,这就是你应该阅读这个答案的原因。
在 IT 世界,尤其是在编程领域,标准几乎就是一切。如果我们不遵循标准,我们的计算机上甚至可能没有视频。如果任何人都遵循自己的标准,那么一切都会显得一团糟,在这种情况下,自动装载机将变得个人化;因此,您最终将拥有许多 Autoloader,而不是一个简单的 Autoloader,每个标准一个,这使您的应用程序更难以维护和调试(因为每个人都可以制造错误)。