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

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

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

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中还可以使用抽象类

trait Hello{

abstract public function say();

}

class one{

use Hello;

public function say(){

}

}

?>

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

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

trait Hello{

}

trait World{

}

trait HW{

use Hello,World;

}

class one{

use Hello,World;

}

class two{

use HW;

}

?>

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

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

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 '
';

$a->B();        //WB

echo '
';

$a->C();        //ZA

?>

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

php traits 使用,php中traits的使用相关推荐

  1. php traits 使用,PHP 中 Traits 简单使用方法

    php是一种单一继承的语言,无法像java一样在一个class中extends多个基类来实现代码重用,PHP 5.4中的traits是新引入的特性,能解决这一代码重用的问题,它能让开发者在多个不同的c ...

  2. php traits作用,php中traits的理解和使用

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

  3. php 中 Traits 详解

    PHP是单继承的语言,在PHP 5.4 Traits出现之前,PHP的类无法同时从两个基类继承属性或方法.php的Traits和Go语言的组合功能有点类似, 通过在类中使用use关键字声明要组合的Tr ...

  4. PHP中traits是用来干嘛的?trait的语法,作用,特点。

    traits 是将一段代码 引入 类中 使用,是的代码(属性和方法)可以更加灵活的被复用. 那么什么使用需要 使用大 trait? 设想一下,加入有父类两个类 同时需要 相同的方法和属性,应该怎么办? ...

  5. php的Traits属性以及基本用法

    一.什么是Traits PHP 5.4中的traits,是新引入的特性,其实际的目的,是为了解决php的单继承问题,用于实现代码重用的方法. Traits可以理解为一组能被不同的类都能调用到的方法集合 ...

  6. [转载]《STL源码剖析》阅读笔记之 迭代器及traits编程技法

    本文从三方面总结迭代器   迭代器的思想   迭代器相应型别及traits思想   __type_traits思想 一 迭代器思想 迭代器的主要思想源于迭代器模式,其定义如下:提供一种方法,使之能够依 ...

  7. 读书笔记 effective c++ Item 47 使用traits class表示类型信息

    STL主要由为容器,迭代器和算法创建的模板组成,但是也有一些功能模板.其中之一叫做advance.Advance将一个指定的迭代器移动指定的距离: 1 template<typename Ite ...

  8. traits的作用和使用

    raits是在5.4中新增的一个用于实现代码重用的方法. php是一种单一继承的语言,我们无法像java一样在一个class中extends多个基类来实现代码重用,现在Traits能解决这一代码重用的 ...

  9. PHP中的Trait方法

    <?php /** 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait.* Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.* Trait 为了减 ...

最新文章

  1. catia过载属性使用方法_catia简明操作手册
  2. JVM: G1和CMS的区别
  3. python保存创建文件报错 with open(fileName,‘w‘) as fp: IOError: [Errno 22] invalid mode (‘w‘) or filename
  4. java复制文件_java多种文件复制方式以及效率比较
  5. 【剑指offer】面试题57 - II:和为s的连续正数序列(Java)
  6. WebConfig另类操作
  7. 认识进程 java 1615387415
  8. 华为云GuassDB(for Redis)发布全新版本推出:Lua脚本和SSL连接加密
  9. [OS] 死锁相关知识点以及银行家算法详解
  10. 洛谷——P1548 [NOIP1997 普及组] 棋盘问题
  11. FLAT:又快又好的中文命名实体识别模型
  12. 2022年java开发面试题整理合集
  13. 黑马程序员_JavaWeb013
  14. 一级路由器静态路由访问二级路由器的方法二
  15. 计算机bios设置论文,玩转电脑必看知识——各种BIOS设置详解 的更多相关文章
  16. Win10 OpenGL安装及配置
  17. 【AI_数学知识】概率论
  18. Linux 内核 | 网络流量限速方案大 PK
  19. [EGNN] Exploiting Edge Features for Graph Neural Networks 利用图神经网络的边特征 论文详解 CVPR 2019
  20. Python实现VRP常见求解算法——离散量子行为粒子群算法(DQPSO)

热门文章

  1. 把Hybris Commerce本地tomcat的keystore给本机的tomcat使用
  2. where is Angular parts filled
  3. 我们在tool里给ui element设置断点,然后操作的时候,断点就触发了。Framework是咋实现的
  4. how is my real odata request hijacked by Mock server
  5. 如何将windows10的显示字体调大
  6. raise event when save - COM_PR_CHBADI_RAISE_WF_EVENT
  7. 使用代码执行organization unit determination逻辑
  8. hierarchy change in CRM - step1 inbound CSAIBASE queue
  9. 使用visualVM launcher的一些注意事项
  10. 来自Google资深工程师的API设计最佳实践