PHP 的__autoload()
(文档)对我来说非常有趣。以下是它的工作原理:
- 您尝试使用一个类,例如
new Toast_Mitten()
(脚注1) - 该类尚未加载到内存中。PHP 缩回拳头,让你犯错。
- 它暂停。“等等,”它说。“
__autoload()
定义了一个函数。” 它运行它。 - 在该函数中,您以某种方式将字符串映射
Toast_Mitten
到classes/toast_mitten.php
并告诉它需要该文件。确实如此。 - 现在该类在内存中,您的程序继续运行。
内存好处:你只加载你需要的类。简洁的好处:您可以停止在任何地方包含如此多的文件,而只需包含您的自动加载器。
事情变得特别有趣,如果
1)您__autoload()
有一种从类名中自动确定文件路径和名称的方法。例如,也许您所有的课程都在classes/
并且Toast_Mitten
将在classes/toast_mitten.php
. 或者,也许您将类命名为Animal_Mammal_Weasel
,它将位于classes/animal/mammal/animal_mammal_weasel.php
.
2)您使用工厂方法来获取类的实例。
$Mitten = Mitten::factory('toast');
Mitten::factory 方法可以对自己说,“让我们看看,我有一个名为 的子类Toast_Mitten()
吗?如果有,我将返回它;如果没有,我将返回我自己的一个通用实例 - 一个标准的连指手套。哦,看!__autoload()
告诉我有一个专门的吐司类。好的,这是一个实例!
因此,您可以开始在整个代码中使用通用手套,当您需要为 toast 提供特殊行为的那一天到来时,您只需创建该类并bam!- 您的代码正在使用它。
我的问题是双重的:
- (事实)其他语言有类似的结构吗?我看到Ruby 有一个 autoload,但似乎您必须在给定的脚本中指定您希望在哪些类上使用它。
- (观点)这也太神奇了吧?如果你最喜欢的语言不这样做,你会想,“嘿,漂亮,我们应该有那个”或“我很高兴语言 X 不是那么马虎?”
1 我向非英语母语人士道歉。这是一个小笑话。据我所知,没有“烤面包手套”这样的东西。如果有,那将是拿起热吐司的手套。也许您在自己的国家/地区有敬酒手套?