【问题标题】:How to masquerade child classes in parent class with autoloading (php)如何使用自动加载(php)伪装父类中的子类
【发布时间】:2010-09-20 23:02:13
【问题描述】:

我有一个由大约十个子类继承的基类。这些子类中的大多数具有非常相似的行为,但我只想为其中的三个定义专门的方法。

是否可以通过在每次实例化子类的对象时自动加载父类来伪装这些类的存在?这样我就不必用相同的代码定义多个类了?

例如

class ParentClass {
    public function __construct() {
        switch(get_class($this)) {
            case "ChildClass1" : do_stuff() break;
            case "ChildClass2" : do_other_stuff() break;
            default: break;
        }
    }
}

$c1 = new ChildClass1();
$c2 = new ChildClass2();

...只有一个文件ParentClass.php(没有单独的文件ChildClass1.phpChildClass2.php)。

【问题讨论】:

  • 不要为了节省创建几个文件而扭曲您的代码。如果您将共享实现放在ParentClass 中,并且仅在子类中必要时覆盖,则文件ChildClass1.phpChildClass2.php 将不会有重复的代码。

标签: php class inheritance autoload


【解决方案1】:

你为什么不这样做呢?

class ParentClass {
  public function __construct()
  {
    $this->do_stuff();
  }
}

class SpecializedClass
  extends ParentClass
{
  public function __construct()
  {
    // Optional, do the stuff parent does (do_stuff());
    parent::__construct();
    // ... specialized construction logic here
    $this->do_other_stuff();
  }

  // ... specialized methods here.
}

class NormalClass1
  extends ParentClass
{

}

class SpecialClass1
  extends SpecializedClass
{

}

// ... etc.

【讨论】:

  • 我的环境如何找到这些类?如果类在单独的文件中,我当前的设置会自动加载它,但如果它在不同的类文件中定义,则无法加载它。
  • 啊,我明白你在这里问什么。在我看来,依靠 __autoload 功能是快速获得令人困惑的代码库的好方法。您应该将相关的类分组到文件中,并在需要的地方手动要求它们。使用 require_once 非常棒,因为如果您有循环依赖或复杂的依赖链,您将不会多次包含同一组类。
【解决方案2】:

您必须将逻辑添加到__autoload() 函数或spl_autoload_register(),它通过字符串比较决定要加载的文件/如果它可能是您父母的孩子之一。

【讨论】:

    【解决方案3】:

    在我看来,保持每个文件一个类的约定是有益的。它使自动加载器保持简单,促进各个类的重用,最重要的是,使源代码更易于导航和推理。如果您有许多具有共同父类的类,请考虑将它们移至单独的子目录并将此目录添加到自动加载器。

    对于 PHP 以外的具有更好导入语义的语言,这不一定是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-28
      • 1970-01-01
      相关资源
      最近更新 更多