详解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中目录,文件操作详谈
Mar 19 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
Nov 21 PHP
用PHP读取超大文件的实例代码
Apr 01 PHP
PHP简洁函数(PHP简单明了函数语法)
Jun 10 PHP
php和javascript之间变量的传递实现代码
Dec 19 PHP
php中利用str_pad函数生成数字递增形式的产品编号
Sep 30 PHP
PHP制作万年历
Jan 07 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
Mar 01 PHP
thinkphp3.x中session方法的用法分析
May 20 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
Sep 21 PHP
PHP通过文件保存和更新信息的方法分析
Sep 12 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
PHP PDO函数库详解
2010/04/27 PHP
PHP中计算字符串相似度的函数代码
2012/12/29 PHP
详解PHP中的Traits
2015/07/29 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
2016/04/07 PHP
Laravel日志用法详解
2016/10/09 PHP
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
jQuery实现的网页竖向菜单效果代码
2015/08/26 Javascript
创建自己的jquery表格插件
2015/11/25 Javascript
JavaScript动态创建div等元素实例讲解
2016/01/06 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
详解angularJs指令的3种绑定策略
2017/04/13 Javascript
浅析vue中的MVVM实现原理
2019/03/04 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
2019/08/02 jQuery
使用layui的layer组件做弹出层的例子
2019/09/27 Javascript
小程序input数据双向绑定实现方法
2019/10/17 Javascript
小程序接口的promise化的实现方法
2019/12/11 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
详解ES6新增字符串扩张方法includes()、startsWith()、endsWith()
2020/05/12 Javascript
JavaScript的垃圾回收机制与内存管理
2020/08/06 Javascript
[09:13]DOTA2-DPC中国联赛 正赛 Ehome vs Magma 选手采访 1月19日
2021/03/11 DOTA
python友情链接检查方法
2015/07/08 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
Python判断中文字符串是否相等的实例
2018/07/06 Python
解决django model修改添加字段报错的问题
2019/11/18 Python
Django分组聚合查询实例分享
2020/04/29 Python
Python-split()函数实例用法讲解
2020/12/18 Python
Python Spyder 调出缩进对齐线的操作
2021/02/26 Python
物流仓管员工作职责
2014/01/06 职场文书
聘用意向书
2014/07/29 职场文书
食品安全汇报材料
2014/08/18 职场文书
2014保险公司个人工作总结
2014/12/09 职场文书
高校自主招生教师推荐信
2015/03/23 职场文书
商务司机岗位职责
2015/04/10 职场文书
企业安全生产检查制度
2015/08/06 职场文书
62句有关感恩节文案(推荐收藏)
2019/11/28 职场文书