php traits 使用,php中traits的使用
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的使用相关推荐
- php traits 使用,PHP 中 Traits 简单使用方法
php是一种单一继承的语言,无法像java一样在一个class中extends多个基类来实现代码重用,PHP 5.4中的traits是新引入的特性,能解决这一代码重用的问题,它能让开发者在多个不同的c ...
- php traits作用,php中traits的理解和使用
在php的面向对象开发中,我们经常会遇到这样的一种情况: 有两个类 teacher 和 pupil类这两个类都有如下的一些属性 age,sex,address,school,email等.为此,我们抽 ...
- php 中 Traits 详解
PHP是单继承的语言,在PHP 5.4 Traits出现之前,PHP的类无法同时从两个基类继承属性或方法.php的Traits和Go语言的组合功能有点类似, 通过在类中使用use关键字声明要组合的Tr ...
- PHP中traits是用来干嘛的?trait的语法,作用,特点。
traits 是将一段代码 引入 类中 使用,是的代码(属性和方法)可以更加灵活的被复用. 那么什么使用需要 使用大 trait? 设想一下,加入有父类两个类 同时需要 相同的方法和属性,应该怎么办? ...
- php的Traits属性以及基本用法
一.什么是Traits PHP 5.4中的traits,是新引入的特性,其实际的目的,是为了解决php的单继承问题,用于实现代码重用的方法. Traits可以理解为一组能被不同的类都能调用到的方法集合 ...
- [转载]《STL源码剖析》阅读笔记之 迭代器及traits编程技法
本文从三方面总结迭代器 迭代器的思想 迭代器相应型别及traits思想 __type_traits思想 一 迭代器思想 迭代器的主要思想源于迭代器模式,其定义如下:提供一种方法,使之能够依 ...
- 读书笔记 effective c++ Item 47 使用traits class表示类型信息
STL主要由为容器,迭代器和算法创建的模板组成,但是也有一些功能模板.其中之一叫做advance.Advance将一个指定的迭代器移动指定的距离: 1 template<typename Ite ...
- traits的作用和使用
raits是在5.4中新增的一个用于实现代码重用的方法. php是一种单一继承的语言,我们无法像java一样在一个class中extends多个基类来实现代码重用,现在Traits能解决这一代码重用的 ...
- PHP中的Trait方法
<?php /** 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait.* Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.* Trait 为了减 ...
最新文章
- catia过载属性使用方法_catia简明操作手册
- JVM: G1和CMS的区别
- python保存创建文件报错 with open(fileName,‘w‘) as fp: IOError: [Errno 22] invalid mode (‘w‘) or filename
- java复制文件_java多种文件复制方式以及效率比较
- 【剑指offer】面试题57 - II:和为s的连续正数序列(Java)
- WebConfig另类操作
- 认识进程 java 1615387415
- 华为云GuassDB(for Redis)发布全新版本推出:Lua脚本和SSL连接加密
- [OS] 死锁相关知识点以及银行家算法详解
- 洛谷——P1548 [NOIP1997 普及组] 棋盘问题
- FLAT:又快又好的中文命名实体识别模型
- 2022年java开发面试题整理合集
- 黑马程序员_JavaWeb013
- 一级路由器静态路由访问二级路由器的方法二
- 计算机bios设置论文,玩转电脑必看知识——各种BIOS设置详解 的更多相关文章
- Win10 OpenGL安装及配置
- 【AI_数学知识】概率论
- Linux 内核 | 网络流量限速方案大 PK
- [EGNN] Exploiting Edge Features for Graph Neural Networks 利用图神经网络的边特征 论文详解 CVPR 2019
- Python实现VRP常见求解算法——离散量子行为粒子群算法(DQPSO)
热门文章
- 把Hybris Commerce本地tomcat的keystore给本机的tomcat使用
- where is Angular parts filled
- 我们在tool里给ui element设置断点,然后操作的时候,断点就触发了。Framework是咋实现的
- how is my real odata request hijacked by Mock server
- 如何将windows10的显示字体调大
- raise event when save - COM_PR_CHBADI_RAISE_WF_EVENT
- 使用代码执行organization unit determination逻辑
- hierarchy change in CRM - step1 inbound CSAIBASE queue
- 使用visualVM launcher的一些注意事项
- 来自Google资深工程师的API设计最佳实践