gpt4 book ai didi

php - PHP 的__autoload() 有多独特?

转载 作者:数据小太阳 更新时间:2023-10-29 06:41:43 25 4
gpt4 key购买 nike

PHP 的 __autoload() ( documentation ) 对我来说非常有趣。这是它的工作原理:

  • 你尝试使用一个类,比如 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 的特殊类。好的,这是一个实例!

因此,您可以开始在整个代码中使用通用连指手套,当有一天您需要为 toast 提供特殊行为时,您只需创建该类并砰! - 您的代码正在使用

我的问题有两个:

  • (事实) 其他语言有类似的结构吗?我看到了 Ruby has an autoload , 但似乎您必须在给定的脚本中指定您希望在哪些类上使用它。
  • (意见) 这也太神奇了吧?如果您最喜欢的语言没有做到这一点,您会认为,“嘿,漂亮,我们应该拥有那个”或“伙计,我很高兴语言 X 没有那么草率?”

1 我向非英语母语人士致歉。这是一个小笑话。据我所知,没有“ toast 连指手套”这样的东西。如果有的话,那将是用来夹热 toast 的连指手套。也许您在自己的国家有 toast 连指手套?

最佳答案

Ruby 和 PHP 都是从 Perl 中的 AUTOLOAD 获取的。

请注意,AutoLoader 模块是一组使用 AUTOLOAD 功能执行常见任务的帮助程序。

关于php - PHP 的__autoload() 有多独特?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3966931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com