详解PHP神奇又有用的Trait


Posted in PHP onMarch 25, 2019

php和java,c++一样都是单继承模式。但是像python,是支持多继承(即Mixin模式)。那么如何在php中实现多继承模式?这就需要使用trait。

trait Arrayabletrait{
	public function toArray(){

	}
}

class Model{
	use Arrayabletrait;
}


$model = new Model();
$model->toArray();

Trait使用场景

  1. 有些功能不需要类的方法属性,但是在不同的类都有使用需求。例如上面的对象转数组方法。这种情况可以使用一个基类定义toArray方法,则需要将这类基础方法定义在尽可能顶层的基类当中,保证所有的类都能够调用这个方法。
  2. 类因为某些需求,已经继承了第三方类对象。例如第三方orm模型类。这种情况如果要给类附加一些公共的功能,除了创建一个继承于orm模型的基类,复制一套公共功能的代码之外,就可以使用trait。

trait使用注意

方法优先级

trait Arrayabletrait{

	public function logname(){
		return 'trait:'.$this->name;
	}

	public static function staticlog(){
		return 'trait:'.self::$staticname;
	}
}
class Obj{
	protected $name = 'Obj';
	public static $staticname = 'Obj';
	public function logname(){
		return 'obj:'.$this->name;
	}
}
class Model extends Obj{
	protected $name = 'model';
	public static $staticname = 'model';
	use Arrayabletrait;

	public function logname(){
		return 'model:'.$this->name;
	}
	public static function staticlog(){
		return 'model:'.self::$staticname;
	}
}

class Model2 extends Obj{
	protected $name = 'model2';
	public static $staticname = 'Model2';
	use Arrayabletrait;
}

$model = new Model();
$model2 = new Model2();
echo $model->logname()."\n";
echo $model2->logname()."\n";
echo Model::staticlog()."\n";
echo Model2::staticlog()."\n";

上面输出内容分别为model:model,trait:model2,model:model,trait:model2.可以看出,trait方法优先级为 当前对象>trait>父类,以上规则同样使用于静态调用。

属性定义要特别小心!!trait中可以定义属性。但是不能和usetrait当前类定义的属性相同,否则会报错:define the same property。但是,如果父类使用了trait,子类定义trait中存在的属性,则没有问题。

trait Arrayabletrait{
	public $logger='file';
	public function log(){
		return 'trait:'.$this->logger.$this->name;
	}
}
class Obj{
	use Arrayabletrait;
	protected $name = 'Obj';

}
class Model extends Obj{
	protected $logger = 'redis';
}
$model = new Model();
echo $model->log()."\n";

私有属性私有方法。triat中可以方位use类的私有属性私有方法!!

从以上可以看出,trait本身是对类的一个扩展,在trait中使用$this ,self,static,parent都与当前类一样,zend底层将trait代码嵌入到类当中,相当于底层帮我们实现了代码复制功能。

多个trait相同方法。

trait Arrayabletrait1{
	public function log(){
		return 'trait1:'.$this->logger.$this->name;
	}
	public function logname(){
		return 'trait1:'.$this->name;
	}
}
trait Arrayabletrait2{
	public function log(){
		return 'trait2:'.$this->logger.$this->name;
	}
	public function logname(){
		return 'trait1:'.$this->name;
	}
}

class Model{
	public $name = 'model';
	use Arrayabletrait1,Arrayabletrait2{
		Arrayabletrait1::log insteadof Arrayabletrait2;
		Arrayabletrait2::logname insteadof Arrayabletrait1;
		Arrayabletrait2::logname as logname1;
	}
	protected $logger = 'redis';
}
$model = new Model();
echo $model->log()."\n";
echo $model->logname1()."\n";

多trait相同的方法,需要使用instanceof 指定使用哪个trait的方法。instanceof后面的使用的trait。可以使用as设置添加方法别名(添加,原有方法还是能调用!!)。as还可以改变方法的访问控制

Arrayabletrait2::logname as private改为私有方法。

以上所述是小编给大家介绍的PHP神奇又有用的Trait详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
PHP下操作Linux消息队列完成进程间通信的方法
Jul 24 PHP
PHP函数学习之PHP函数点评
Jul 05 PHP
解析将多维数组转换为支持curl提交的一维数组格式
Jul 08 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
Mar 13 PHP
php解析json数据实例
Aug 19 PHP
thinkphp常见路径用法分析
Dec 02 PHP
php与Mysql的一些简单的操作
Feb 26 PHP
php创建多级目录的方法
Mar 24 PHP
PHP使用反射机制实现查找类和方法的所在位置
Apr 22 PHP
php正则提取html图片(img)src地址与任意属性的方法
Feb 08 PHP
php使用parse_str实现查询字符串解析到变量中的方法
Feb 17 PHP
Yii2框架自定义验证规则操作示例
Feb 08 PHP
PHP自动载入类文件函数__autoload的使用方法
Mar 25 #PHP
PHP生成短网址的思路以及实现方法的详解
Mar 25 #PHP
PHP错误提示It is not safe to rely on the system……的解决方法
Mar 25 #PHP
mongodb和php的用法详解
Mar 25 #PHP
PHP随机数函数rand()与mt_rand()的讲解
Mar 25 #PHP
php微信扫码支付 php公众号支付
Mar 24 #PHP
PHP实现支持CURL字符串证书传输的方法
Mar 23 #PHP
You might like
广播爱好者需要了解的天线知识
2021/03/01 无线电
php读取torrent种子文件内容的方法(测试可用)
2016/05/03 PHP
[原创]静态页面也可以实现预览 列表不同的显示方式
2006/10/14 Javascript
修改js Calendar日历控件 兼容IE9/谷歌/火狐
2013/01/04 Javascript
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
JS二维数组的定义说明
2014/03/03 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
2014/08/18 Javascript
JS原型对象的创建方法详解
2016/06/16 Javascript
Angular路由ui-router配置详解
2018/08/01 Javascript
npm 常用命令详解(小结)
2019/01/17 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
JavaScript展开操作符(Spread operator)详解
2019/07/20 Javascript
Jquery属性的获取/设置及样式添加/删除操作技巧分析
2019/12/23 jQuery
[01:14:35]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第一局
2016/02/26 DOTA
[51:53]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第二场 11.01
2020/11/02 DOTA
玩转python爬虫之URLError异常处理
2016/02/17 Python
Python用threading实现多线程详解
2017/02/03 Python
Python基于tkinter模块实现的改名小工具示例
2017/07/27 Python
Python语言的变量认识及操作方法
2018/02/11 Python
Python使用googletrans报错的解决方法
2018/09/25 Python
python 实现一个反向单位矩阵示例
2019/11/29 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
CSS3 制作绽放的莲花采用效果叠加实现
2013/01/31 HTML / CSS
详解Canvas事件绑定
2018/06/27 HTML / CSS
在线服装零售商:SheIn
2016/07/22 全球购物
linux面试题参考答案(5)
2014/09/01 面试题
高中毕业的自我鉴定
2013/12/09 职场文书
女儿十岁生日答谢词
2014/01/27 职场文书
个人近期表现材料
2014/02/11 职场文书
刑事辩护授权委托书
2014/09/13 职场文书
农村婚礼司仪主持词
2015/06/29 职场文书
离婚民事起诉状
2015/08/03 职场文书
css filter和getUserMedia的联合使用
2022/02/24 HTML / CSS
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS