PHP:类中的特征&其他特征相互矛盾

时间:2016-04-26 10:45:27

标签: php traits

我有PHP特征的问题。 我想在类和类中使用的特征中使用特征。

示例:

trait Loggable {
  protected function log(msg) { 
    echo msg; 
  }
}

trait SomeOtherTrait {
  use Loggable;
}

class MyClass {
  use SomeOtherTrait, Loggable;
}

但是这会导致碰撞,因为Loggable在类中使用了两次(一次在类中,一次通过另一个特性),但我不理解这个问题,因为封装功能是特性的全部,对? 所以我只想在包含Loggable特征的任何地方使用log方法......

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

2 个答案:

答案 0 :(得分:2)

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();

答案 1 :(得分:2)

将特征复制所有方法和属性用于类。它与扩展不同。实际上,您实际上是在尝试将相同的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');
  }
}