PHP 中的部分类,就像我们在 C 语言中一样#

2022-08-30 20:02:38

有没有简单的方法可以在PHP中拥有像C#中那样的分部类概念?我试图使用不同的命名空间使它成为可能,但它无法正常工作。


答案 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::shouldGenerateTraitForfalseGeneratedTrait.php

但是,考虑对象组合而不是此方法可能对您大有裨益。

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


答案 2

PHP 将 Traits 用于此任务:

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

它们允许您将类部分从隔离的分部文件(Trait)包含到共享其逻辑的不同类中,也可能包括其他共享逻辑(如多重继承)


推荐