PHP之Trait详解_php trait-程序员宅基地

技术标签: php  

php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,php出了Trait这个特性

用法:通过在类中使用use 关键字,声明要组合的Trait名称,具体的Trait的声明使用Trait关键词,Trait不能实例化

如下代码实例:

<?php
trait Dog{
    
    public $name="dog";
    public function bark(){
    
        echo "This is dog";
    }
}
class Animal{
    
    public function eat(){
    
        echo "This is animal eat";
    }
}
class Cat extends Animal{
    
    use Dog;
    public function drive(){
    
        echo "This is cat drive";
    }
}
$cat = new Cat();
$cat->drive();
echo "<br/>";
$cat->eat();
echo "<br/>";
$cat->bark();
?>

将会如下输出
在这里插入图片描述

再测试Trait、基类和本类对同名属性或方法的处理,如下代码

<?php
trait Dog{
    
    public $name="dog";
    public function drive(){
    
        echo "This is dog drive";
    }
    public function eat(){
    
        echo "This is dog eat";
    }
}

class Animal{
    
    public function drive(){
    
        echo "This is animal drive";
    }
    public function eat(){
    
        echo "This is animal eat";
    }
}

class Cat extends Animal{
    
    use Dog;
    public function drive(){
    
        echo "This is cat drive";
    }
}
$cat = new Cat();
$cat->drive();
echo "<br/>";
$cat->eat();

?>

如下显示
在这里插入图片描述
所以:Trait中的方法会覆盖 基类中的同名方法,而本类会覆盖Trait中同名方法
注意点:当trait定义了属性后,类就不能定义同样名称的属性,否则会产生 fatal error,除非是设置成相同可见度、相同默认值。不过在php7之前,即使这样设置,还是会产生E_STRICT 的提醒

一个类可以组合多个Trait,通过逗号相隔,如下

use trait1,trait2

当不同的trait中,却有着同名的方法或属性,会产生冲突,可以使用insteadof或 as进行解决,insteadof 是进行替代,而as是给它取别名
如下实例:

<?php
trait trait1{
    
    public function eat(){
    
        echo "This is trait1 eat";
    }
    public function drive(){
    
        echo "This is trait1 drive";
    }
}
trait trait2{
    
    public function eat(){
    
        echo "This is trait2 eat";
    }
    public function drive(){
    
        echo "This is trait2 drive";
    }
}
class cat{
    
    use trait1,trait2{
    
        trait1::eat insteadof trait2;
        trait1::drive insteadof trait2;
    }
}
class dog{
    
    use trait1,trait2{
    
        trait1::eat insteadof trait2;
        trait1::drive insteadof trait2;
        trait2::eat as eaten;
        trait2::drive as driven;
    }
}
$cat = new cat();
$cat->eat();
echo "<br/>";
$cat->drive();
echo "<br/>";
echo "<br/>";
echo "<br/>";
$dog = new dog();
$dog->eat();
echo "<br/>";
$dog->drive();
echo "<br/>";
$dog->eaten();
echo "<br/>";
$dog->driven();
?>

输出如下
在这里插入图片描述

as 还可以修改方法的访问控制

<?php
trait Animal{
    
    public function eat(){
    
        echo "This is Animal eat";
    }
}

class Dog{
    
    use Animal{
    
        eat as protected;
    }
}
class Cat{
    
    use Animal{
    
        Animal::eat as private eaten;
    }
}
$dog = new Dog();
$dog->eat();//报错,因为已经把eat改成了保护

$cat = new Cat();
$cat->eat();//正常运行,不会修改原先的访问控制
$cat->eaten();//报错,已经改成了私有的访问控制
?>

Trait也可以互相组合,还可以使用抽象方法,静态属性,静态方法等,实例如下

<?php
trait Cat{
    
    public function eat(){
    
        echo "This is Cat eat";
    }
}

trait Dog{
    
    use Cat;
    public function drive(){
    
        echo "This is Dog drive";
    }
    abstract public function getName();
    
    public function test(){
    
        static $num=0;
        $num++;
        echo $num;
    }
    
    public static function say(){
    
        echo "This is Dog say";
    }
}
class animal{
    
    use Dog;
    public function getName(){
    
        echo "This is animal name";
    }
}

$animal = new animal();
$animal->getName();
echo "<br/>";
$animal->eat();
echo "<br/>";
$animal->drive();
echo "<br/>";
$animal::say();
echo "<br/>";
$animal->test();
echo "<br/>";
$animal->test();
?>

输出如下
在这里插入图片描述

作者:奋斗live
链接:https://www.jianshu.com/p/fc053b2d7fd1
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_35606400/article/details/119521064

智能推荐

白帽子讲Web安全 第四章 跨站点请求伪造(CSRF)-程序员宅基地

文章浏览阅读142次。1、CSRF : Cross Site Request Forgery. 该攻击通过在授权用户访问的页面中包含链接或脚本的方式工作。是一种依赖Web浏览器的、被混淆过的代理人攻击。2、常见特性: 依靠用户标识危害网站 利用网站对用户标识的信任 欺骗用户的浏览器发送HTTP请..._白帽子讲安全 第四章

阿里云ECS, centos安装JDK和tomcat_阿里云centos安装jdk,tomcat-程序员宅基地

文章浏览阅读375次。1. 购买阿里云ECS, 省略。。购买完成后,如需要修改root账号密码,可以通过下面截图入口进行修改,修改完成后需要重新启动实例。2. 下载JDK,安装JDK我的是64位的,所以我选择64位rpm安装包进行下载使用 SSH Secure File Transfer Client工具将下载后的文件传输到 CentOS 系统上。我这里上传到/usr/local/java 目录下安装J..._阿里云centos安装jdk,tomcat

textarea 为什么placeholder不生效_textarea placeholder不生效-程序员宅基地

文章浏览阅读1.1k次。最近也是写JQ的项目,遇到好多的小坑,这也是有遇到一个,placeholder不生效的问题,代码如下: <textarea placeholder="请输入相关内容" id="contents" rows="10" maxlength="2000" onchange="sizecontrol()" onkeydown="sizecontrol()" onkeyup="sizecontrol()" > </textarea>看起来没啥问题,但是原生属性placeholder_textarea placeholder不生效

db2游标与mysql游标区别_DB2游标使用注意事项-程序员宅基地

文章浏览阅读70次。1、游标的一般使用步骤 (1)定义游标 EXEC SQL DECLARE MY_CURSOR CURSOR FOR........ (2)打开游标 EXEC SQL OPEN MY_CURSOR1、游标的一般使用步骤(1)定义游标EXEC SQL DECLARE MY_CURSOR CURSOR FOR........(2)打开游标EXEC SQL OPEN MY_CURSOR ;(3)读取游标E..._db2游标更新

正则表达式_非贪婪皮-程序员宅基地

文章浏览阅读3.1k次。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。_非贪婪皮

arcgis NoData区域去除(去除影像黑边)_arcmap栅格数据导png时nodata变黑边-程序员宅基地

文章浏览阅读8.7k次,点赞9次,收藏57次。问题描述:裁剪操作或其他一些操作后影响会出现NoData区域,在制图时不好看。如下图红色区域为NoData区域,更改Arcgis显示设置无效A:方法是ArcTools->Spatial Analyst Tools->Map Algebra->Single Output Map Algebra(就是栅格计算器).算法表达式为: Con(IsNull([raster]),0,[raster])。注意大小写其中[raster]是输入栅格名称。这个表达式的效果是将图像中N._arcmap栅格数据导png时nodata变黑边

随便推点

Unity3d 游戏汉化之IL注入文本替换--木石世纪_汉化unity3d游戏-程序员宅基地

文章浏览阅读9k次。最近下了个游戏叫木石世纪(Timber and Stone),沙盒游戏类,看着还不错.搜了下游戏资料,有人求汉化但是由于是小众游戏,没人出汉化.看了眼是Unity3d的,既然是.Net的,只要资源不是在资源包里,应该都还是蛮简单的.刚开始做了个字符串替换,发现有些地方还是比较麻烦,还不如拿UnityEngine里面的GUI函数开刀,也就是有了这么一次简单的哦汉化过程.首先写个简单的类用_汉化unity3d游戏

【PTA】7-1 找最贵的书和最便宜的书 (20 分)_给定n本书的名称和定价,本题要求编写程序,查找并输出其中定价最高和最低的书的名-程序员宅基地

文章浏览阅读2k次,点赞2次,收藏7次。给定n本书的名称和定价,本题要求编写程序,查找并输出其中定价最高和最低的书的名称和定价。输入格式:输入第一行给出正整数n(<10),随后给出n本书的信息。每本书在一行中给出书名,即长度不超过30的字符串,随后一行中给出正实数价格。题目保证没有同样价格的书。输出格式:在一行中按照“价格, 书名”的格式先后输出价格最高和最低的书。价格保留2位小数。输入样例:在这里给出一组输入。例如:3Programming in C21.5Programming in VB18.5_给定n本书的名称和定价,本题要求编写程序,查找并输出其中定价最高和最低的书的名

Mybatis Link(MyBatis Plus X) 单表查询,连表查询,动态设置表名(3)_ew.entity-程序员宅基地

文章浏览阅读1.8k次。四. MyBatis-X 单表查询,连表查询,动态表名展示 随着业务量的增长,部分表的数据量过于庞大,可以设置保留少量数据的查询表,或者是根据时间段进行分表,由于表的结构是一致的,所以只需要更改表名即可。 例如 t_sys_log 系统日志表,随着访问量的增大,日志表的数据很快可以达到千万级,那么可以对表进行切分,一年一张表,且设置一张 t_sys_log_ro(ro == r..._ew.entity

第5章 精通pandas合并操作(使用pandas进行数据分析,从小白逆袭大神,你会了吗?)_new = pd.dataframe({'1': df['0'].mean(),-程序员宅基地

文章浏览阅读439次。文章目录第5章 合并一、append与assign1. append方法2. assign方法二、combine与update1. comine方法2. update方法三、concat方法四、merge与join1. merge函数2. join函数第5章 合并import numpy as npimport pandas as pddf = pd.read_csv('data/table.csv')df.head()一、append与assign1. append方法(a)利用序列添_new = pd.dataframe({'1': df['0'].mean(),

hexo博客文章置顶功能实现的两种方法_hexo置顶文章-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏13次。写在前面本文主要描述了如何实现hexo文章置顶功能,讲述了通过修改源码和通过更改插件两种方式实现,以及如何添加置顶显示。文章可能还有很多不足,请大家谅解,欢迎大佬提意见。本文使用的东西win10电脑hexo 4.0.0文章目录写在前面本文使用的东西1.使用到的插件简述1.1hexo-generator-index插件1.2hexo-generator-index-pin-top插件1..._hexo置顶文章

TypeError: rescale() got an unexpected keyword argument ‘multichannel‘_typeerror: gaussian() got an unexpected keyword ar-程序员宅基地

文章浏览阅读1.5k次,点赞6次,收藏4次。运行出现错误TypeError: rescale() got an unexpected keyword argument 'multichannel'如果为 None,则假定图像是灰度(单通道)图像。否则,此参数指示数组的哪个轴对应于通道。将multichannel=True改成channel_axis=-1。scikit-image新版本已经废弃了multichannel函数。_typeerror: gaussian() got an unexpected keyword argument 'multichannel

推荐文章

热门文章

相关标签