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 协议》,转载必须注明作者和本文链接