PHP:类中的特质和其他特质相互冲突


PHP: Traits in Classes & other traits conflicting

我对PHP特性有问题。我想在类中使用特征,并在类中使用的特征中使用。

例:

trait Loggable {
  protected function log(msg) { 
    echo msg; 
  }
}
trait SomeOtherTrait {
  use Loggable;
}
class MyClass {
  use SomeOtherTrait, Loggable;
}

但这会导致冲突,因为 Loggable 在类中使用了两次(一次在类中,一次通过其他特征),但我不明白这个问题,因为封装功能是特征的全部内容,对吧?所以我只想在包含可移动特征的任何地方使用 log 方法......

所以问题是:为什么会发生碰撞?两者(特征和类)都指向相同的特征和方法,因此它不应该是冲突。

使用特征将其所有方法和属性复制到类中。它与扩展不同。所以实际上你正在尝试将相同的log方法复制到MyClass两次。

如果您确实需要/想要同时使用这两个特征,则需要按照手册中的说明解决此冲突。例如:

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');
  }
}
SomeOtherTrait 使用特性 Loggable,

因此您可以访问 Loggable 的所有受保护和公共成员,这同样适用于所有使用 SomeOtherTrait 的类。在这里,您可以访问Loggable和SomeOtherTrait的所有公共和受保护成员。

trait Loggable {
   protected function log($msg) { 
      echo $msg; 
   }
}
trait SomeOtherTrait {
   use Loggable;
}
class MyClass {
   use SomeOtherTrait;
   public function test() 
   { 
       $this->log("test");
   }
}
$myClass = new MyClass();
$myClass->test();