详解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实现ping
Oct 09 PHP
PHP 在线翻译函数代码
May 07 PHP
PHP写的求多项式导数的函数代码
Jul 04 PHP
PHP中的多行字符串传递给JavaScript的两种方法
Jun 19 PHP
php读取csc文件并输出
May 21 PHP
详解PHP实现定时任务的五种方法
Jul 25 PHP
浅谈PHP的反射API
Feb 26 PHP
php事务回滚简单实现方法示例
Mar 28 PHP
PHP实现的数独求解问题示例
Apr 18 PHP
Yii2语言国际化的配置教程
Aug 19 PHP
PHP中quotemeta()函数的用法讲解
Apr 04 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 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
phpmyadmin 常用选项设置详解版
2010/03/07 PHP
修改php.ini以达到屏蔽错误信息并记录日志
2013/06/16 PHP
php调用nginx的mod_zip模块打包ZIP文件
2014/06/11 PHP
CI框架验证码CAPTCHA辅助函数用法实例
2014/11/05 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
PHP编程计算文件或数组中单词出现频率的方法
2017/05/22 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
javascript面向对象编程代码
2011/12/19 Javascript
js 操作select和option常用代码整理
2012/12/13 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
2019/09/24 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
Python selenium文件上传方法汇总
2020/11/19 Python
Python获取文件所在目录和文件名的方法
2017/01/12 Python
python 多线程中子线程和主线程相互通信方法
2018/11/09 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
python except异常处理之后不退出,解决异常继续执行的实现
2020/04/25 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
python怎么提高计算速度
2020/06/11 Python
通过实例解析python and和or使用方法
2020/11/14 Python
Zooplus葡萄牙:欧洲领先的网上宠物商店
2018/07/01 全球购物
欧洲、亚洲、非洲和拉丁美洲的度假套餐:Great Value Vacations
2019/03/30 全球购物
Erwin Müller穆勒家居瑞士官网:您整个家庭的邮购公司
2019/12/28 全球购物
英国设计师珠宝网站:Joshua James Jewellery
2020/03/01 全球购物
十佳班主任事迹材料
2014/01/18 职场文书
天猫活动策划方案
2014/08/21 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
人身损害赔偿协议书
2016/03/22 职场文书
详解MySQL中的pid与socket
2021/06/15 MySQL
Nginx 配置 HTTPS的详细过程
2022/05/30 Servers