博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP trait使用
阅读量:7056 次
发布时间:2019-06-28

本文共 2663 字,大约阅读时间需要 8 分钟。

  hot3.png

php使用关键字trait

php只能继承一个父类,但是,使用trait,类可以使用多个方法来实现想要做的事情,相当于实现多继承。

class Base{    public function sayHello(){        echo 'hello';    }}trait SayHello{    public function sayHello(){		//调用父类的方法        parent::sayHello();        echo 'world';    }}class MyHelloWorld extends Base{    use SayHello;}$o =  new MyHelloWorld();$o->sayHello();//输出 hello world!

trait中的方法和类中的方法相同的时候,优先级的顺序是类中的方法会将trait中的方法覆盖,eg:

trait HelloWorld {    public function sayHello() {        echo 'Hello World!';    }}class TheWorldIsNotEnough {    use HelloWorld;    public function sayHello() {        echo 'Hello Universe!';    }}$o = new TheWorldIsNotEnough();$o->sayHello();   //此处输出 'Hello Universe!'

使用多个trait

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();//以上会输出HelloWorld!

如果两个trait使用了同一个方法,没有明确解决会发生报错, 为了解决多个trait在同一个类的命名冲突,需要使用insteadof操作符明确指定使用冲突方法的哪一个,as 操作符可以将其中的一个冲突的方法以另一个名称来引入。

trait A {    public function smallTalk() {        echo 'a';    }    public function bigTalk() {        echo 'A';    }}trait B {    public function smallTalk() {        echo 'b';    }    public function bigTalk() {        echo 'B';    }}class Talker {    use A, B {        B::smallTalk insteadof A;        A::bigTalk insteadof B; 		A::bigTalk insteadof SB;    }}class Aliased_Talker {    use A, B {        B::smallTalk insteadof A;        A::bigTalk insteadof B;        B::bigTalk as talk;    }}$o = new Talker();$o->smallTalk();$o->bigTalk();$o-SB();

trait来组成trait

trait Hello{    public function sayHello(){        echo 'Hello';    }}trait World{    public function sayWorld(){        echo 'world';    }}trait HelloWorld{    use Hello,World;}class my_hello{    use HelloWorld;}$a = new my_hello();$a->sayHello();$a->sayWorld();

trait支持抽象方法的使用

trait Hello{    public function sayHelloWorld(){        echo 'Hello'.$this->getWorld();    }    abstract public function getWorld();}class Myhello{    private $world;    use Hello;    public function getWorld(){       return  $this->world;    }    public function setWorld($val){        $this->world = $val;    }}$a = new Myhello();$a->setWorld('123');$a->sayHelloWorld();

可以定义变量和方法

trait StaticExample{    //可以定义变量    public $x = '100';    //可以定义方法    public static function  doSomething(){        return 'do something';    }}class Example{    use StaticExample;}$e = new Example();echo $e->x;echo Example::doSomething();

转载于:https://my.oschina.net/kakoi/blog/730034

你可能感兴趣的文章
位运算实现整数加法
查看>>
实现级联查询
查看>>
js时钟
查看>>
java字符 字符串
查看>>
iterator (迭代器)的应用的用法(一)
查看>>
Java 接口代理
查看>>
关于treeView1_AfterSelect方法中节点的使用(代码介绍)
查看>>
ORA-16009: invalid redo transport destination
查看>>
Oracle 12c ORA-01516: nonexistent log file, data file, or temporary file "10"
查看>>
一对一映射的三种方式以及对lazyload的特别关注
查看>>
麦进斗:magento如何安装子主题
查看>>
Stack Based Windows Buffer Overflow Tutorial
查看>>
单双链表,通过指针变动交换相邻元素
查看>>
redhat中设置环境变量PATH的方法
查看>>
在bootstrap的modal中使用popover和tooltip
查看>>
linux系统下搭建squid服务
查看>>
2013-7-18学习作业[有常考面试题]
查看>>
ant工具的使用和功能
查看>>
Linux 常用系统工具与初始化配置
查看>>
31、C#里面的图片框PictureBox的使用
查看>>