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