PHP:类中的特征与其他特征冲突

标签 php traits

我对 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/

相关文章:

rust - 为类型构造函数推断类型

rust - 为什么 `Self` 在编译时需要一个常量大小来调用自由函数,而等效的特征函数却不需要?

scala - 为什么 trait 方法需要 asInstanceOf 而类方法不需要

php - 取消设置 cookie Laravel 4

php - 如何获取该对象中的值?

javascript - 使用 Jquery/Javascript/PHP 删除基于滚动的可见通知

PHP变量声明

rust - 如何解决错误 "the precise format of ` Fn`-family traits' type parameters is subject to change”?

c++ - 使用 typename 参数时,模板参数推导/替换失败

php - 有没有什么办法可以在不安装服务器的情况下在本地测试PHP?