我对 PHP 特性有疑问。 我想在一个类中使用一个特征,并在这个类中使用一个特征。
例子:
trait Loggable {
protected function log(msg) {
echo msg;
}
}
trait SomeOtherTrait {
use Loggable;
}
class MyClass {
use SomeOtherTrait, Loggable;
}
但这会导致冲突,因为在类中使用了两次 Loggable(一次在类中,一次通过另一个特征),但我不明白这个问题,因为封装功能是特征的全部,对吧? 所以我只想在包含 Loggable 特征的任何地方使用 log 方法...
所以问题是:为什么会发生碰撞?两者(特征和类)都指向相同的特征和方法,因此不应该发生冲突。
最佳答案
使用特征将其所有方法和属性复制到一个类中。它与扩展不同。所以实际上你试图将相同的 log
方法复制两次到 MyClass
。
如果你真的需要/想要使用这两个特征,你需要按照 the manual 中的描述解决这个冲突。 .例如:
class MyClass {
use SomeOtherTrait, Loggable {
SomeOtherTrait::log insteadof Loggable;
}
}
或者:
class MyClass {
use SomeOtherTrait, Loggable {
Loggable::log as originalLog;
SomeOtherTrait::log as overriddenLog;
}
public function test() {
$this->originalLog('Logged with Loggable');
$this->overriddenLog('Logged with SomeOtherTrait');
}
}
关于PHP:类中的特征与其他特征冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36862646/