可以通过使用命名空间使用相同的特征和方法名称

时间:2020-05-08 14:24:15

标签: class namespaces traits php-7.3

为了使系统名称约定的变体减少,我尝试使用相同的特征名称和函数,并用名称空间将它们封装起来以避免冲突。当环境仅具有类和名称空间,而没有包含特征时,此设置才起作用。

观察:

我确实理解错误消息,由于系统试图加载同名的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

0 个答案:

没有答案