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,通过逗号相隔,如下

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();
?>

输出如下

php中访问控制_PHP之Trait详解相关推荐

  1. php动态+trait,详解PHP神奇又有用的Trait

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

  2. Linux中/proc目录下文件详解

    Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...

  3. python创建列向量_关于Numpy中的行向量和列向量详解

    关于Numpy中的行向量和列向量详解 行向量 方式1 import numpy as np b=np.array([1,2,3]).reshape((1,-1)) print(b,b.shape) 结 ...

  4. jQuery中getJSON跨域原理详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...

  5. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  6. python的执行过程_在交互式环境中执行Python程序过程详解

    前言 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Py ...

  7. python平方数迭代器_对python中的高效迭代器函数详解

    python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...

  8. 对python 数据处理中的LabelEncoder 和 OneHotEncoder详解

    对python 数据处理中的LabelEncoder 和 OneHotEncoder详解_起飞的木木的博客-CSDN博客_labelencoder原理

  9. Oracle中序列(Sequence)详解

    Oracle中序列(Sequence)详解 一 序列定义 序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).不占用磁盘空间,占用内存. 其主要用 ...

最新文章

  1. SpringBoot第二十四篇: springboot整合docker
  2. Prototype1.5.1源代码解读分析-1
  3. python入门需要多久-怎么自学python,大概要多久?
  4. 如何将Emacs添加到右键菜单并显示为“烤肉”
  5. mysql四种事务级别_【MySQL 知识】四种事务隔离级别
  6. 2018.12.31 NOIP训练 czy的后宫5(树形dp)
  7. 技术优点_波纹管内衬管制造技术及优点
  8. Prototype(原型模式)
  9. 【RTD】AD7793三线式铂电阻PT100/PT1000应用
  10. 硬件知识:打印机常见的故障及维护,值得收藏!
  11. sql——手机号码归属地、身份证前六位归属地、省市区级联
  12. linux系统优化步骤,优化Linux系统的12个步骤
  13. 【笔记】用Python写百度翻译网络爬虫
  14. 电信物联网平台对接教程
  15. android分屏模式_Android分屏显示总结
  16. 360浏览器网页按钮点击无效
  17. 关于IntelliJ IDEA
  18. vue前端video视频截图与录影功能的简单实现
  19. 华为诺亚方舟实验室招聘实习生
  20. Java编程思想第四版读书笔记——第九章 接口

热门文章

  1. 无代码时代下,程序员不够用了!
  2. 微信团队回应“部分用户朋友圈无法刷新”;罗永浩:准备做综艺节目;Apache Spark 3.0 发布| 极客头条...
  3. 一派胡言!Swift 不是多范式函数式编程语言
  4. 6 万出头的北京房价,程序员如何靠自己安家?
  5. 微信 iOS 版正式支持深色模式;谷歌宣布彻底取消I/O开发者大会;Visual Studio 2019 16.5发布|极客头条...
  6. 5 句话,带你看准区块链和分布式账本最新趋势!
  7. Java 8:一文掌握 Lambda 表达式 | CSDN 博文精选
  8. 时至今日,百度无人车还好吗?
  9. @程序员,使用了 SQL 就不能用 DevOps?
  10. 腾讯起诉西瓜视频直播《王者荣耀》;人人车否认破产;苹果人事大变动! | 极客头条...