代码之家  ›  专栏  ›  技术社区  ›  Nathan Long

PHP的@autoload()有多独特?

  •  12
  • Nathan Long  · 技术社区  · 14 年前

    PHP的 __autoload() ( documentation )对我来说很有趣。其工作原理如下:

    • 你试着用一个类,比如 new Toast_Mitten() 1 )
    • 类尚未加载到内存中。PHP收回它的拳头,用一个错误来打击您。
    • __自动加载() 函数定义了“它运行它。
    • Toast_Mitten classes/toast_mitten.php
    • 现在类在内存中,程序继续运行。

    内存优势:只加载所需的类。简洁的好处:你可以停止在任何地方包含这么多文件,只包括你的自动加载器。

    如果

    1) 你的 有一种从类名自动确定文件路径和名称的方法。例如,也许你所有的课程都在 classes/ 吐司 会在里面 类/toast-mitten.php . 或者你可以给类命名为 Animal_Mammal_Weasel ,它将在 classes/animal/mammal/animal_mammal_weasel.php .

    2) 使用工厂方法获取类的实例。

    $Mitten = Mitten::factory('toast');
    

    factory方法可以对自己说:“让我们看看,我是否有一个子类 Toast_Mitten() ? 如果是,我会返回;如果不是,我只返回我自己的一个通用实例-一个标准的mitten。哦,看! __自动加载() 敬酒的特别班。好吧,举个例子!”

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

    我的问题有两个:

    • 事实 )其他语言有相似的结构吗?我看到了 Ruby has an autoload ,但似乎必须在给定的脚本中指定希望在哪些类上使用它。
    • ( 意见

    1个 我向非英语母语的人道歉。这是个小笑话。据我所知,没有“烤手套”这种东西。如果有的话,那就是一个用来捡热吐司的手套。也许你在自己的国家有烤手套?

    5 回复  |  直到 14 年前
        1
  •  5
  •   Andy Lester    14 年前
        2
  •  3
  •   Crozin    14 年前
    1. 不使用 __autoload() . 是一个 全球的 spl_autoload_register() 向您的系统注册另一个自动加载器。这允许你使用几个自动装弹机,这是很常见的做法。
    2. 命名空间 new MyProject\IO\FileReader(); 应该在里面 MyProject/IO/FileReader.php 文件。
    3. factory方法可以对自己说,“让我们看看,我有一个名为Toast_Mitten()的子类吗?”?如果是,我会返回;如果不是,我只返回我自己的一个通用实例-一个标准的mitten。哦,看!__autoload()告诉我吐司有一个特殊的类。好吧,举个例子!”

      相当复杂的代码,请使用简单而详细的代码:

      try {
          $mitten = new ToastMitten();
          // or $mitten = Mitten::factory('toast');
      } catch (ClassNotFoundException $cnfe) {
          $mitten = new BaseMitten();
      }
      
        3
  •  1
  •   Petah    14 年前

    我认为这个功能非常方便,而且我还没有看到其他类似的功能。我也不需要这些功能。

        4
  •  1
  •   Ionuț G. Stan    14 年前

    ClassLoader . 可能还有其他语言,但它们坚持使用一些默认实现。

    当我们在这里的时候。如果 __autoload 加载任何类型的符号,而不仅仅是类:常量、函数和类。

        5
  •  1
  •   Nathan Long    12 年前

    见Ruby的模块const丢失

    我刚刚了解到:Ruby在模块上有一个名为 const_missing Foo::Bar Bar 还不在记忆中(尽管我想 Foo 必须在记忆中)。

    This example in ruby-doc.org 显示了一种使用它来实现该模块的自动加载程序的方法。根据Russ Olsen的“雄辩的Ruby”(第21章,“使用缺少的方法进行灵活的错误处理”),这实际上是Rails用来加载新的ActiveRecord模型类的方法,其中还包括 康斯特失踪 ).

    它之所以能够做到这一点,是因为“习惯于配置”的思维方式:如果您引用一个名为 ToastMitten ,如果它存在,它将在 app/models/toast_mitten.rb