Частичный класс в PHP, как в С#

Есть ли простой способ иметь понятие частичного класса в PHP, как у нас в С#? Я попытался сделать это возможным, используя другое пространство имен, но оно не сработало.

Ответы

Ответ 1

Они не существуют.

Если, однако, вы пытаетесь внедрить генератор кода, для которого может быть присоединен код пользовательской земли (следуя одному и тому же варианту использования, как на С#), тогда может быть жизнеспособным вариантом:

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 и необходимо, чтобы при восстановлении класса рукописный код штриха не сбивался.

Однако, этот был бы полезен для рассмотрения композиции объекта по этому подходу.

Есть моменты, когда я чувствую, что сгенерированный подход к коду может быть более чистым, например, с типами "сущность", но в каждом конкретном случае.

Ответ 2

PHP использует для этого следующие черты:

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

Они позволяют включать части классов из изолированных файлов в разные классы