insteadof

在php手册中间搜索insteadof是没有结果的。

insteadof主要是用来解决在同一个类中同时使用多个trait,然而在使用的这些trait中方法名称冲突的问题。

借用别人的例子:

<?php

class Base
{
  public function hello()
  {
    echo 'method hello from class Base' . '<br>';
  }
}

trait Hello
{
  public function hello()
  {
    echo 'method hello from Trait Hello' . '<br>';
  }
  public function hi()
  {
    echo 'method hi from Trait Hello' . '<br>';
  }
  abstract public function getValue();
  static public function staticMethod()
  {
    echo 'static method staticMechod from Trait Hello' . '<br>';
  }
  public function staticValue()
  {
    static $value;
    $value++;
    echo $value . '<br>';
  }
}

trait Hi
{
  public function hello()
  {
    parent::hello();
    echo 'method hello from Trait Hi' . '<br>';
  }
  public function hi()
  {
    echo 'method hi from Trait Hi' . '<br>';
  }
}

trait HelloHi
{
  use Hello, Hi{
    Hello::hello insteadof Hi;
    Hi::hi insteadof Hello;
  }
}

class MyNew extends Base
{
  use HelloHi;
  private $value = 'class MyNew' . '<br>';
  public function hi()
  {
    echo 'method hi from class MyNew' . '<br>';
  }
  public function getValue()
  {
    retturn $this->value;
  }
}

$obj = new MyNew();
$obj->hello();
//输出:'method hello from Trait Hello'
//优先级顺序:trait类中的方法覆盖了base中的方法,然后通过insteadof 指定了Hello中的hello方法覆盖了Hi中的hello方法

posted @ 2017-04-11 16:55  牛奶无花果  阅读(779)  评论(0)    收藏  举报