Trait 代码复用 优先级

  • 881
<?php

/**
 * trait 可以当做类来使用  但是不可以实例化
 */
Trait demo1{
  public function hello1(){
    return __METHOD__;
  }

}
Trait demo2{
  public function hello2(){
    return __METHOD__;
  }
}


class demo{
  //把代码的方法拿进来 当前类就可以直接调用  复用
  use demo1,demo2;
  public function hello(){
    return __METHOD__;
  }

  public function test1(){
    return $this->hello1();
  }

  public function test2(){
    return $this->hello2();
  }
}


$demo = new demo();
echo $demo->hello();
//demo::hello


echo '<hr>';
echo $demo->test1();
//demo1::hello1

echo '<hr>';
echo $demo->test2();
//demo2::hello2
 ?>


<?php

/**
 * trait 优先级的问题
 * 当前类的方法跟trait类 父类 重名 优先级
 * 本类方法优先级 高于trait类
 * trait类的方法 优先级 高于父类
 * 总结:优先级顺序 本类 => Trait类 => 父类
 */

/**
 * Trait 类  我的优先级 在于父类之前 本类之后
 */
Trait demo1{
  public function hello(){
    return __METHOD__;
  }

}

/**
 * 父类  我的优先级最低
 */
class Test{
  public function hello(){
    return __METHOD__;
  }
}

/**
 * 本类  优先级最高
 */
class demo extends Test{
  //把代码的方法拿进来 当前类就可以直接调用  复用
  use demo1;
  public function hello(){
    return __METHOD__;
  }

}


$demo = new demo();
echo $demo->hello();

 ?>

<?php

/**
 * 当Trait 类存在多个同名方法的时候
 */

/**
 * 我有hello方法
 */
Trait Demo1{
  public function hello(){
    return __METHOD__;
  }
}
/**
 * 我有hello方法
 */
Trait Demo2{
  public function hello(){
    return __METHOD__;
  }
}
/**
 * 我有hello方法
 */
class Test{
  public function hello(){
    return __METHOD__;
  }
}
class demo extends Test{
  //把代码的方法拿进来 当前类就可以直接调用  复用
  use Demo1,Demo2{
    Demo1::hello insteadof Demo2;
    Demo2::hello as Demo2Hello;
  }
  // public function hello(){
  //   return __METHOD__;
  // }

  public function test1(){
    return $this->hello1();
  }
  public function test2(){
    return $this->Demo2Hello();
  }
}
$demo = new demo();
echo $demo->hello();
//本类有hello方法 优先级最高 输出没问题
//

/**
 * 注释掉本类的hello方法  报错存在 Trait类方法 冲突
 * 加规则  demo1的hello方法替换掉 demo2的hello方法
 */

// use Demo1,Demo2{
//   Demo1::hello insteadof Demo2; //替换掉demo2
//   Demo2::hello as Demo2Hello; //demo2 设置别名
// }
 ?>

weinxin
我的微信
这是我的微信扫一扫
开拓者博主
  • 本文由 发表于 2020年1月5日10:23:28
  • 转载请务必保留本文链接:https://www.150643.com/534.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: