详解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 相关文章推荐
模板引擎Smarty深入浅出介绍
Dec 06 PHP
header跳转和include包含问题详解
Sep 08 PHP
CodeIgniter输出中文乱码的两种解决办法
Jun 12 PHP
php实现Linux服务器木马排查及加固功能
Dec 29 PHP
Laravel中使用阿里云OSS Composer包分享
Feb 10 PHP
PHP-CGI远程代码执行漏洞分析与防范
May 07 PHP
php利用ffmpeg提取视频中音频与视频画面的方法详解
Jun 07 PHP
Laravel学习教程之View模块详解
Sep 18 PHP
thinkPHP框架整合tcpdf插件操作示例
Aug 07 PHP
Laravel 集成微信用户登录和绑定的实现
Dec 27 PHP
php中yar框架实例用法讲解
Dec 27 PHP
php TP5框架生成二维码链接
Apr 01 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
header导出Excel应用示例
2014/01/24 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
2016/04/28 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
2020/08/26 PHP
详解CSS样式中的 !important * _ 符号
2021/03/09 HTML / CSS
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
原生js和jQuery写的网页选项卡特效对比
2015/04/27 Javascript
js实现键盘Enter键提交表单的方法
2015/05/27 Javascript
动态加载js、css的简单实现代码
2016/05/26 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
2016/07/25 Javascript
使用webpack打包koa2 框架app
2018/02/02 Javascript
Koa代理Http请求的示例代码
2018/10/10 Javascript
javascript实现点亮灯泡特效示例
2019/10/15 Javascript
处理JavaScript值为undefined的7个小技巧
2020/07/28 Javascript
Python文件夹与文件的操作实现代码
2014/07/13 Python
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
2015/02/04 Python
简单谈谈python的反射机制
2016/06/28 Python
win系统下为Python3.5安装flask-mongoengine 库
2016/12/20 Python
Python中多个数组行合并及列合并的方法总结
2018/04/12 Python
基于python代码实现简易滤除数字的方法
2018/07/17 Python
python实现打砖块游戏
2020/02/25 Python
Python线程协作threading.Condition实现过程解析
2020/03/12 Python
Python绘制数码晶体管日期
2021/02/19 Python
简单介绍Object类的功能、常用方法
2013/10/02 面试题
奥巴马演讲稿
2014/01/08 职场文书
餐厅经理岗位职责和岗位目标
2014/02/13 职场文书
出生医学证明书
2014/09/15 职场文书
党员检讨书
2014/10/13 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
2014年行政工作总结
2014/11/19 职场文书
胡桃夹子观后感
2015/06/11 职场文书
2019年健身俱乐部的创业计划书
2019/08/26 职场文书
Go语言特点及基本数据类型使用详解
2022/03/21 Golang
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers