目录
2. 同名方法在父类、当前类、trait 中的优先级是:当前类>trait>父类
3. 一个类中使用了多个trait,trait方法同名有冲突,可用insteadof决定用哪个方法
4. as 别名:可为某个方法引入别名,也可修改别名方法的访问控制
1. trait基本用法示例
<?php
trait theTrait{
public function traitFunction() {
echo 'hello ';
}
}
class baseClass{
public function baseClassFunction(){
echo 'world';
}
}
class theClass extends baseClass{
use theTrait;
}
$class = new theClass();
$class->traitFunction();
$class->baseClassFunction();//hello world
2. 同名方法在父类、当前类、trait 中的优先级是:当前类>trait>父类
<?php
trait theTrait{
public function commonFunction(){
echo 'trait';
}
}
class baseClass{
public function commonFunction(){
echo 'baseClass';
}
}
class theClass extends baseClass{
use theTrait;
public function commonFunction(){
echo 'theClass ';
}
}
// 注释对应的commonFunction()即可看到优先级
$theClass = new theClass();
$theClass->commonFunction();
3. 一个类中使用了多个trait,trait方法同名有冲突,可用insteadof决定用哪个方法
<?php
trait theTrait_1{
public function traitFunction(){
echo 'trait_1-Function';
}
}
trait theTrait_2{
public function traitFunction(){
echo 'trait_2-Function';
}
}
class theClass{
use theTrait_1,theTrait_2{
theTrait_1::traitFunction insteadof theTrait_2;
}
}
$theClass = new theClass();
$theClass->traitFunction();
4. as 别名:可为某个方法引入别名,也可修改别名方法的访问控制
<?php
trait theTrait{
public function traitFunction(){
echo 'traitFunction';
}
}
class theClass{
use theTrait{
theTrait::traitFunction as as_1;
theTrait::traitFunction as private as_2;
}
}
$theClass = new theClass();
$theClass->as_1();
$theClass->as_2();// 将无法访问
5. 用多个trait组成一个新的trait
<?php
trait Hello {
public function sayHello() {
echo 'Hello ';
}
}
trait World {
public function sayWorld() {
echo 'World!';
}
}
trait HelloWorld {
use Hello, World;
}
class MyHelloWorld {
use HelloWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
6. 必须在类中实现trait的抽象方法
<?php
trait theTrait{
abstract public function traitAbstractFunction();
}
class theClass{
use theTrait;
// 注释掉此方法将报错
public function traitAbstractFunction(){
echo 'ok';
}
}
$theClass = new theClass();
7. trait中的静态成员
<?php
trait theTrait{
public static $staticVar = 'staticVar ';
public static function staticFunction(){
echo 'staticFunction';
}
}
class theClass{
use theTrait;
}
echo theClass::$staticVar;
theClass::staticFunction();