【问题标题】:Partial class in PHP like we have in C#PHP 中的部分类,就像我们在 C# 中一样
【发布时间】:2014-03-06 15:09:56
【问题描述】:

有没有什么简单的方法可以像我们在 C# 中那样在 PHP 中拥有 partial class 的概念? 我尝试使用不同的命名空间使其成为可能,但它无法工作。

【问题讨论】:

  • 你为什么想要它? ...顺便说一句,这是一个诚实的问题。
  • 可能是你在找traits
  • 现在写我的课有点乱。我想向它添加更多方法,但我不想弄乱现有代码。
  • +1 用于提出合理的问题。部分类可以通过减少代码混乱来提高代码的可维护性。由于新的或不断变化的业务需求,随着时间的推移,类变得越来越复杂,它们尤其有用。我当然希望 PHP 支持它们。
  • 这是一个合理的问题,但类复杂性并不是支持它的好理由。我认为在 C# 中支持它是一个不好的理由。然而,代码生成是一个足够好的理由;设计师、EF 等。如果您的意图是规避“我的文件太大”,那么是时候重构类了。

标签: c# php oop


【解决方案1】:

它们不存在。

但是,如果您尝试实现一个代码生成器,可以为其附加用户级代码(遵循与 C# 中相同的用例),那么以下可能 是一个可行的选择:

class Generator
{
    public function generate(Definition $definition)
    {
        if ($this->shouldGenerateTraitFor($definition)) {
            $this->generateTraitFor($definition);
        }
        $this->generateClassFor($definition);
    }
}

鉴于上述一些实现,您可以:

(new Generator())->generate(new Definition([
    'class' => 'GeneratedClass', 
    'trait' => 'GeneratedTrait',
]));

生成的代码可能类似于:

class GeneratedClass
{
    use GeneratedTrait;
}

trait GeneratedTrait
{
    // @todo; add "partial" code
}

关于Generator::shouldGenerateTraitFor 需要注意的重要一点是,如果它返回false,则特征将不会重新生成。这可能取决于GeneratedTrait.php 是否存在,并且是确保在重新生成类时不会破坏手写特征代码所必需的。

然而,考虑object composition 而不是这种方法,可能*对您大有裨益。

* 有时我觉得生成的代码方法可以更简洁,例如使用“实体”类型,但这是个案。

【讨论】:

    【解决方案2】:

    PHP 使用 Traits 来完成这项任务:

    http://php.net/manual/en/language.oop5.traits.php

    它们允许您将绝缘部分文件(特征)中的类部分包含到共享其逻辑或其他共享逻辑(如多重继承)的不同类中

    【讨论】:

    猜你喜欢
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2010-12-26
    • 1970-01-01
    • 2020-12-12
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多