多个特征同时使用相同的基本特征
Multiple traits uses same base trait at the same time
好吧,假设有以下问题:
trait Base
{
public function doSomething()
{
// Do fancy stuff needed in other traits
}
}
trait A
{
use Base;
public function foo()
{
// Do something
}
}
trait B
{
use Base;
public function bar()
{
// Do something else
}
}
我现在想实现一个 class,它同时使用 A
和 B
:
class MyClass
{
use A, B;
}
PHP 告诉我它不能重新定义函数 doSomething()
。 PHP 无法检测到 A
和 B
共享一个相同的特征并且不将其复制两次到 MyClass
的原因是什么(这是一个错误还是防止我编写不干净代码的功能)?
对于我的问题,是否有比我最终采用的解决方法更好的解决方案:
trait Base
{
public function doSomething()
{
// Do fancy stuff needed in other traits
}
}
trait A
{
abstract function doSomething();
public function foo()
{
// Do something
}
}
trait B
{
abstract function doSomething();
public function bar()
{
// Do something else
}
}
然后是我的 class:
class MyClass
{
use Base, A, B;
}
您可以像这样解决与 "insteadof" 的冲突:
class MyClass
{
use A, B {
A::doSomething insteadof B;
}
}
编辑
对于更多的特征,解决冲突可以是这样的:
class MyClass
{
use A, B, C, D {
A::doSomething insteadof B, C, D;
}
}
这已在 PHP 7.3 中修复:
trait A
{
public function a(){}
}
trait B
{
use A;
}
trait C
{
use A;
}
class D
{
use B, C;
}
结果:
PHP 7.3+ Fine
PHP ^5|^7.2: Fatal error: Trait method a has not been applied, because there are collisions with other trait methods on D in /in/Z5GTo on line 18
- https://3v4l.org/Z5GTo
- https://bugs.php.net/bug.php?id=63911
- https://www.php.net/ChangeLog-7.php#7.3.0 (修复了错误 #63911(相同的特征方法在组合过程中引发错误)
@Grzegorz 的支持,将 link 发布到 PHP 错误,一个答案,但被投票删除。我尝试重新打开它,但打不开。
好吧,假设有以下问题:
trait Base
{
public function doSomething()
{
// Do fancy stuff needed in other traits
}
}
trait A
{
use Base;
public function foo()
{
// Do something
}
}
trait B
{
use Base;
public function bar()
{
// Do something else
}
}
我现在想实现一个 class,它同时使用 A
和 B
:
class MyClass
{
use A, B;
}
PHP 告诉我它不能重新定义函数 doSomething()
。 PHP 无法检测到 A
和 B
共享一个相同的特征并且不将其复制两次到 MyClass
的原因是什么(这是一个错误还是防止我编写不干净代码的功能)?
对于我的问题,是否有比我最终采用的解决方法更好的解决方案:
trait Base
{
public function doSomething()
{
// Do fancy stuff needed in other traits
}
}
trait A
{
abstract function doSomething();
public function foo()
{
// Do something
}
}
trait B
{
abstract function doSomething();
public function bar()
{
// Do something else
}
}
然后是我的 class:
class MyClass
{
use Base, A, B;
}
您可以像这样解决与 "insteadof" 的冲突:
class MyClass
{
use A, B {
A::doSomething insteadof B;
}
}
编辑 对于更多的特征,解决冲突可以是这样的:
class MyClass
{
use A, B, C, D {
A::doSomething insteadof B, C, D;
}
}
这已在 PHP 7.3 中修复:
trait A
{
public function a(){}
}
trait B
{
use A;
}
trait C
{
use A;
}
class D
{
use B, C;
}
结果:
PHP 7.3+ Fine
PHP ^5|^7.2: Fatal error: Trait method a has not been applied, because there are collisions with other trait methods on D in /in/Z5GTo on line 18
- https://3v4l.org/Z5GTo
- https://bugs.php.net/bug.php?id=63911
- https://www.php.net/ChangeLog-7.php#7.3.0 (修复了错误 #63911(相同的特征方法在组合过程中引发错误)
@Grzegorz 的支持,将 link 发布到 PHP 错误,一个答案,但被投票删除。我尝试重新打开它,但打不开。