文档章节

php中traits的使用

hirainn
 hirainn
发布于 2016/04/22 09:56
字数 711
阅读 53
收藏 0

php是单继承语言,但是如果想在一个class中实现多继承的话,可以使用traits代替.

关于使用.使用关键字trait: 从某个方面,可以理解为class,但是不能实例化

trait中可以定义public,protected,private方法/属性,且父类中如果使用trait,子类也会继承trait,甚至private方法/属性也能继承

<?php
trait Hello{
    public function sayH(){
        echo 'hello ';
    }
    protected function sayW(){
        echo 'world';
    }
    private function pri(){
        echo 'this is a private function';
    }
    static public function wowo(){
        echo 'this is a static function';
    } 
    public function tst(){
        echo 'this is trait';
    }
}

class one{
    use Hello;
    public function say(){
        $this->pri();
    }
    public function tst(){
        echo 'this is one';
    }
}
class two extends one{
    public function tst(){
        echo 'this is two';
    }
}
//偷懒,报错的方法也假设可以执行下去
Hello::wowo();        //this is a static function
$human = new one();    
$human->sayH();        //hello 
$human->sayW();        //此处报错,调用保护方法
$human->pri();        //此处报错,调用私有方法
$human->tst();        //this is one 
one::wowo();        //this is a static function
$human->say();        //可以内部调用 this is a private function
$people = new two();
$people->sayH();    //hello 
$people->sayW();    //报错,调用保护方法
$people->pri();    //此处报错,调用私有方法   !注意,私有属性继承下来了
two::wowo();        //this is a static function
$people->say();    //内部调用 this is a private function
$people->tst();    //this is two
?>

可以发现,trait 中的 私有属性 也可以继续下来,可以理解为,two把use Hello 也继承下来了,而且如果子类中有同名方法,则会覆盖父类和trait中的方法

trait中还可以使用抽象类

<?php
trait Hello{
    abstract public function say();
}
class one{
    use Hello;
    public function say(){
    }
}
?>

当class one中不存在say方法时,便会报错.

当有多个trait时,使用,隔开,或者使用复合traits

<?php
trait Hello{
}
trait World{
}
trait HW{
    use Hello,World;
}
class one{
    use Hello,World;
}
class two{
    use HW;
}
?>

以上one 跟 two的实现效果是一样的;

当两个trait钟的方法名一样时,需要用关键字insteadof指定使用哪个,不然就会报错,如果两个都想保留,则可以用as通过别名来实现,同时as也可以实现对方法权限的更改

<?php
trait H{
    public function A(){
	echo 'HA';
    }
    public function B(){
	echo 'HB';
    }
}
trait W{
    public function A(){
	echo 'WA';
    }
    public function B(){
	echo 'WB';
    }
}
trait Z{
    public function A(){
        echo 'ZA';
    }
}
//若没有use后{}里的说明,则会报错
//Trait method A has not been applied, because there are collisions with other trait methods on HW
trait HW{
    use H,W{
	H::A insteadof W,Z;
	W::B insteadof H;  //W中的B方法取代H中的B方法
	Z::A as C;
	A as protected;
    }
}
class one{
    use HW;
    public function say(){
        $this->A();
    }
}
$a = new one();
$a->say();        //HA
$a->A();        //因为被改变了权限,所以无法在外部调用
echo '<br>';
$a->B();        //WB
echo '<br>';
$a->C();        //ZA
?>


参考: http://blog.csdn.net/longlongmylove/article/details/7521379

© 著作权归作者所有

hirainn
粉丝 35
博文 83
码字总数 65318
作品 0
深圳
程序员
私信 提问
PHP之Traits

【PHP之Traits】  1、Traits基础      2、优先级:当前类中的方法会覆盖 Trait 方法,而Trait方法覆盖了基类中的方法。   3、多个Traits,使用use声明列出多个Traits。      4、...

行走的螃蟹
2016/08/24
20
0
PHP traits (复用机制)

最近在学习Laravel中,遇到了很多关于Traits ,查了下资料,分享下。 提到 php 的代码复用,我们可能第一时间会想到继承,但是这种单继承语言一旦派生的子类过多,那么会产生一系列的问题,比...

Coding_ff
2017/05/27
0
0
php trait 简明教程,多重继承的实现方案

http://php.net/manual/en/language.oop5.traits.php 自PHP5.4.0起,PHP实现了代码复用的一个方法,称为traints。 Traits是一种为类似PHP的单继承语音而准备的代码复用机制。Trait为了减少单...

雪之丞
2016/03/28
83
0
php中traits的理解和使用

在php的面向对象开发中,我们经常会遇到这样的一种情况: 有两个类 teacher 和 pupil类这两个类都有如下的一些属性 age,sex,address,school,email等。为此,我们抽象出了一个父类为 huma...

王景华
2015/12/28
16
0
PHP中的traits

PHP 5.4中的traits,是新引入的特性,中文还真不知道如何准确翻译好。其实际的目的,是为了有的场合想用多继承,但PHP又没多继承,于是就发明了这样的一个东西。 Traits可以理解为一组能被不...

Surjur
2015/12/15
34
0

没有更多内容

加载失败,请刷新页面

加载更多

RxJava进行单元测试的方式

@Test public void completeTask_retrievedTaskIsComplete() { // Given a new task in the persistent repository final Task newTask = new Task(TITLE, ""); ......

SuShine
1分钟前
0
0
正则表达式大全

检验手机号码 # 要求:手机号码必须为11位数字,以1开头,第二位为1或5或8。import redef verify_mobile(): mob = input("请输入手机号码:") ret = re.match(r"1[358]\d{9}", m......

彩色泡泡糖
5分钟前
0
0
QT之border-image属性

一、border-image的兼容性 border-image可以说是CSS3中的一员大将,将来一定会大放光彩,其应用潜力真的是非常的惊人。可惜目前支持的浏览器有限,仅Firefox3.5,chrome浏览器,Safari3+支持...

shzwork
6分钟前
0
0
Kubernetes Operator简易教程

1. 安装operator-sdk //安装 operator-sdk$ apt-get install operator-sdk.....$ operator-sdk versionoperator-sdk version: v0.7.0$ go versiongo version go1.11.4 darwin/amd64 2......

Robotcl_Blog
6分钟前
1
0
再谈DAG任务分解和Shuffle RDD

1、DagScheduler分析 DagScheduler功能主要是负责RDD的各个stage的分解和任务提交。Stage分解是从触发任务调度过程的finalStage开始倒推寻找父stage,如果父stage没有提交任务则循环提交缺失...

守望者之父
12分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部