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()
告诉我有一个特殊的烤面包类。好的,这里有一个实例!"
因此,在您的代码中可以开始使用通用手套,当您需要特殊行为的烤面包时,只需创建该类,然后砰!——您的代码就在使用它。
我的问题有两个方面:
- (事实) 其他语言是否有类似的构造?我看到Ruby有一个autoload,但似乎必须在给定脚本中指定您希望在其上使用它的类。
- (意见) 这太神奇了吗?如果您喜欢的语言没有这样做,您会认为:"嘿,真棒,我们应该有这个"还是"我很高兴X语言不那么松散?"
1向非英语母语的读者道歉。这是个小玩笑。据我所知,没有"烤面包手套"这样的东西。如果有的话,那将是一只用来拿热吐司的手套。也许在您自己的国家里有烤面包手套?
class Category_Package_Subpackage_Class
=>category/package/subpackage/class.php
。 - Hannes