php中trait的使用(多继承)

php中trait的使用

为php这种单继承代码提供代码复用方案(多继承 trait类不支持实例化)

优先级顺序

子类>trait类>基类

单个trait类

<?php
class Base {
 public function sayHello() {
 echo 'Hello ';
    }
}

trait SayWorld {
 public function sayHello() {
 parent::sayHello();
 echo 'World!';
    }
}

class MyHelloWorld extends Base {
 use SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello(); // hello world!
?>

多个trait类但不冲突

<?php
trait Hello {
 public function sayHello() {
 echo 'Hello ';
    }
}

trait World {
 public function sayWorld() {
 echo 'World';
    }
}

class MyHelloWorld {
 use Hello, World;
 public function sayExclamationMark() {
 echo '!';
    }
}

$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>

多个trait但冲突


<?php
trait Hello {
    public function say() {
        echo 'Hello world ';
    }
}

trait World {
    public function say() {
        echo '你好!';
    }
}

class MyHelloWorld {

    // 写法1,用instanceof去指定冲突的方法使用哪个trait类
    use Hello, World {
        Hello::say insteadof  World; //  Hello world
    }

    // 写法2,用as方法 去给冲突的方法指定别的方法名称.
    use Hello, World {
        Hello::say as sayOne;
        World::say as sayTwo;
    }

}

$o = new MyHelloWorld();
//$o->sayOne(); // Hello world
$o->sayTwo(); // 你好!
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!