引用自动加载类:
许多编写面向对象应用程序的开发人员为每个类定义创建一个 PHP 源文件。最大的烦恼之一是必须在每个脚本的开头编写一长串所需的包含内容(每个类一个)。
在 PHP 5 中,这不再是必要的。spl_autoload_register() 函数注册任意数量的自动加载器,使得当前未定义的类和接口能够自动加载。通过注册自动加载器,PHP 在因错误而失败之前有最后一次加载类或接口的机会。
那么问题来了,如果一个php文件中有多个类,是否适合autoload使用呢?或者我必须使用require filepath
声明吗?
例如,我在 Protobuf\Client.php 下有一个协议文件:
<?php
namespace Protobuf;
class A {
...
}
class B {
...
}
Run Code Online (Sandbox Code Playgroud)
您必须有一些复杂的函数来从名为 的文件中自动加载这些类Client.php
。这个想法是将你的转化namespace\classname
为directory\filename.php
在这种情况下,您需要命名您的文件A.php
,然后当您调用new Protobuf\A()
它时就会找到它。否则,您将不得不创建一个过于复杂的自动加载器。
假设您确实创建了自动加载器,以便它找到该类A
,然后您可以B
在同一个文件上使用该类,但前提是您已经自动加载A
,否则您必须制定一些算法才能知道该类A
并且B
位于同一页面上。
我会执行上述模式或Magento等应用程序采用的模式,通过替换下划线将类名转换为目录路径:
$class = new Core_Classes_MyClass_Client();
Run Code Online (Sandbox Code Playgroud)
您的自动加载器将替换下划线并加载:
Core/Classes/MyClass/Client.php //or similar scheme
Run Code Online (Sandbox Code Playgroud)
这对我来说是一种简单的方法,但我更喜欢使用命名空间和类。上述方法目前不受欢迎,从命名的角度来看,很容易混淆,因为很多类可能位于同一个文件夹中,或者嵌套得很深到子文件夹中。您可以获得一些非常长的类命名。