php中访问控制_PHP之Trait详解
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详解相关推荐
- php动态+trait,详解PHP神奇又有用的Trait
php和java,c++一样都是单继承模式.但是像python,是支持多继承(即Mixin模式).那么如何在php中实现多继承模式?这就需要使用trait. trait Arrayabletrait{ ...
- Linux中/proc目录下文件详解
Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...
- python创建列向量_关于Numpy中的行向量和列向量详解
关于Numpy中的行向量和列向量详解 行向量 方式1 import numpy as np b=np.array([1,2,3]).reshape((1,-1)) print(b,b.shape) 结 ...
- jQuery中getJSON跨域原理详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...
- java mod %区别_Java中 % 与Math.floorMod() 区别详解
%为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...
- python的执行过程_在交互式环境中执行Python程序过程详解
前言 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Py ...
- python平方数迭代器_对python中的高效迭代器函数详解
python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...
- 对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解_起飞的木木的博客-CSDN博客_labelencoder原理
- Oracle中序列(Sequence)详解
Oracle中序列(Sequence)详解 一 序列定义 序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).不占用磁盘空间,占用内存. 其主要用 ...
最新文章
- SpringBoot第二十四篇: springboot整合docker
- Prototype1.5.1源代码解读分析-1
- python入门需要多久-怎么自学python,大概要多久?
- 如何将Emacs添加到右键菜单并显示为“烤肉”
- mysql四种事务级别_【MySQL 知识】四种事务隔离级别
- 2018.12.31 NOIP训练 czy的后宫5(树形dp)
- 技术优点_波纹管内衬管制造技术及优点
- Prototype(原型模式)
- 【RTD】AD7793三线式铂电阻PT100/PT1000应用
- 硬件知识:打印机常见的故障及维护,值得收藏!
- sql——手机号码归属地、身份证前六位归属地、省市区级联
- linux系统优化步骤,优化Linux系统的12个步骤
- 【笔记】用Python写百度翻译网络爬虫
- 电信物联网平台对接教程
- android分屏模式_Android分屏显示总结
- 360浏览器网页按钮点击无效
- 关于IntelliJ IDEA
- vue前端video视频截图与录影功能的简单实现
- 华为诺亚方舟实验室招聘实习生
- Java编程思想第四版读书笔记——第九章 接口
热门文章
- 无代码时代下,程序员不够用了!
- 微信团队回应“部分用户朋友圈无法刷新”;罗永浩:准备做综艺节目;Apache Spark 3.0 发布| 极客头条...
- 一派胡言!Swift 不是多范式函数式编程语言
- 6 万出头的北京房价,程序员如何靠自己安家?
- 微信 iOS 版正式支持深色模式;谷歌宣布彻底取消I/O开发者大会;Visual Studio 2019 16.5发布|极客头条...
- 5 句话,带你看准区块链和分布式账本最新趋势!
- Java 8:一文掌握 Lambda 表达式 | CSDN 博文精选
- 时至今日,百度无人车还好吗?
- @程序员,使用了 SQL 就不能用 DevOps?
- 腾讯起诉西瓜视频直播《王者荣耀》;人人车否认破产;苹果人事大变动! | 极客头条...