Могу ли я импортировать только некоторые выбранные методы из черты? - PullRequest
1 голос
/ 26 апреля 2020

Если признак содержит несколько свойств и методов, могу ли я импортировать только несколько из них?

trait MyTrait
{
    public function ok()
    {
        echo 'ok';
    }

    public function nope()
    {
        echo 'not ok';
    }
}

class MyClass
{
    use MyTrait {
        MyTrait::ok as ok;
    }
}

$mc = new MyClass;

$mc->ok(); // This should work
$mc->nope(); // This shouldn't work

Проблема в том, что я разрабатываю пакет и хочу импортировать несколько методов из другого пакета (для убедитесь, что определенные действия работают одинаково). Но черта этих методов содержит 11 свойств и 76 методов. Я не хочу, чтобы все это загрязняло мое пространство имен.

Есть ли способ выборочного импорта? Или я должен вернуться к какой-нибудь хитрости с отражением?

1 Ответ

1 голос
/ 26 апреля 2020

Насколько я знаю, вы не можете этого сделать. Использование черты в основном включает его содержание в класс. Свойства и методы, которые он определяет, могут очень хорошо зависеть друг от друга.

Одной из альтернативных опций может быть ручное определение методов, которые вы хотите в классе, который не содержит черты, а вместо этого делегирует вызовы экземпляр класса, который делает.

Примерно так:

trait MyTrait
{
  public function ok(): void
  {
    echo 'ok';
  }

  public function nope(): void
  {
    echo 'not ok';
  }
}

class MyTraitDelegate
{
  use MyTrait;
}

class MyClass
{
  private MyTraitDelegate $traitDelegate;

  public function __construct()
  {
    $this->traitDelegate = new MyTraitDelegate();
    // Note: you could also inject it, but in this case, not sure it's worth.
  }

  public function ok(): void
  {
    $this->traitDelegate->ok();
  }
}

$mc = new MyClass;

$mc->ok();   // works
$mc->nope(); // method not found
...