Можно ли использовать одно и то же имя признака и метода с помощью пространства имен - PullRequest
0 голосов
/ 08 мая 2020

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

Наблюдение:

Я понимаю сообщение об ошибке, что есть коллизия из-за того, что система пытается загрузить 2 метода с тем же именем. Но я предполагал, что конфликт будет разрешен за счет использования разных пространств имен.

Альтернативные решения:

Сохраняя структуру использования черт, кажется, что одним из вариантов является с теми же именами методов в коде, но используйте псевдоним или «вместо» для различения имен методов, используемых системой.

<?php


// ------------------------------------

namespace namespace_1;

trait TraitSameName
{
  function run() {
    echo "Hi, from x1" . "\n";
  }
}

// ------------------------------------

namespace namespace_2;

trait TraitSameName
{
  function run() {
    echo "Hi, from x2" . "\n";
  }
}

// ------------------------------------

class Build
{

  // Traits

  use
    \namespace_1\TraitSameName,
    \namespace_2\TraitSameName
  ;
}

// ------------------------------------

$build_1 = new namespace_1\Build();
$build_2 = new namespace_2\Build();

$build_1->run();
$build_2->run();

Распечатка ошибки:

PHP Fatal error:  Trait method run has not been applied, because there are collisions with other trait methods on namespace_2\Build in Xxx on line 28

Требуется распечатка :

Hi, from x1
Hi, from x2
...