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


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

2   18   2014-02-09 13:59:32

2 ответа:

Их не существует.

Если, однако, вы пытаетесь реализовать генератор кода, к которому можно было бы присоединить пользовательский код (в том же случае использования, что и в 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, и необходимо для того, чтобы при регенерации класса рукописный код признака не был забит.

однако , он мог бы было бы очень полезно рассмотретькомпозицию объекта над этим подходом.

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

PHP использует для этого признаки:

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

Они позволяют включать части класса из изолированного частичного файла (признак) в различные классы, которые разделяют его логику и, возможно, другие общие логики (например, множественное наследование)