php使用trait遇到的一个问题
php是单继承语言,也是就是一个类只能继承一个单独的原始类
自PHP5.4.0起,PHP实现了一种代码复用的方法,称为Trait
trait 是在一些类(Class)的应该具备的特定的属性或方法,而同父级的另外一些类应该避免包含这些属性和方法情况下使用的.
类成员优先级为:当前类>Trait>父类
1 trait funcA {
2 // 二、
3 // trait关键字的使用和类定义一样
4 // 也是可以定义方法和属性的
5 public function a () {
6 echo "hello ";
7 }
8 public function b () {
9 echo "word ";
10 }
11 public function mm () {
12 echo "mmp";
13 }
14 public function c () {
15 $this->a();
16 $this->b();
17 }
18 }
19 class A {
20 // 在类A中使用use关键字,可以实现复用func里面的方法和属性(变相的继承了func中的属性和方法)
21 use funcA;
22 }
23 $a = new A();
24 $a->c();
上面这段代码,最终输出结果为hello hello word
经过断点调试,发现在实例化对象的时候,上述代码中的 a方法被执行了(难道是巧合?换个姿势在测试一次)
1 trait funcA {
2 // 二、
3 // trait关键字的使用和类定义一样
4 // 也是可以定义方法和属性的
5 public function a () {
6 echo "hello";
7 }
8 public function b () {
9 echo "word";
10 }
11 public function c () {
12 $this->a();
13 $this->b();
14 }
15 }
16 class B {
17 // 在类A中使用use关键字,可以实现复用func里面的方法和属性(变相的继承了func中的属性和方法)
18 use funcA;
19 }
20 $a = new B();
21 // $a->c();
按道理来说应该什么也不输出的,不巧的是,在实例化的时候trait中的b方法还是被执行了(那我们再换个姿势来测试一下?)
trait funcA {
// 二、
// trait关键字的使用和类定义一样
// 也是可以定义方法和属性的
public function test1 () {
echo "hello";
}
public function test2 () {
echo "word";
}
public function c () {
$this->test1();
$this->test2();
}
}
class A {
// 在类A中使用use关键字,可以实现复用func里面的方法和属性(变相的继承了func中的属性和方法)
use funcA;
}
$a = new A();
按照我们之前的推断,这次应该不会再输出什么了吧!!对的没错,这次是按照我们的预期来得,所以上述原因是为什么呢?我也不晓得?待大神来答疑解惑。。。。。
php使用trait遇到的一个问题的更多相关文章
- php中trait(性状)与generator(生成器)
PHP中trait(性状)与generator(生成器) 一.trait (性状) 最近在看Josh Lockhat的<Modern PHP>,这本书很薄.但是其中给出了一个很重要的学习方 ...
- Scala Trait
Scala Trait 大多数的时候,Scala中的trait有点类似于Java中的interface.正如同java中的class可以implement多个interface,scala中的cals ...
- PHP中的Trait
Trait 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少单继承语言的限制, ...
- trait与policy模板技术
trait与policy模板技术 我们知道,类有属性(即数据)和操作两个方面.同样模板也有自己的属性(特别是模板参数类型的一些具体特征,即trait)和算法策略(policy,即模板内部的操作逻辑). ...
- php中trait
1.简介 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少单继承语言的限制,使 ...
- trait
参考 引文 在php中,为实现代码复用,有了继承,但是一个类只能继承一个父类,不支持多继承,接口支持多实现,但是接口又不太一样,接口对外负责功能调用声明,不负责实现,由实现了接口的类去实现具体功能逻辑 ...
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
1:Scala之函数式编程学习笔记: :Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User { private ...
- C++ template —— trait与policy类(七)
第15章 trait与policy类---------------------------------------------------------------------------------- ...
- Trait 是什么东西
PHP官方手册里面写的内容是 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少 ...
随机推荐
- 【OpenJ_Bailian - 4070 】全排列
全排列 Descriptions: 对于数组[1, 2, 3],他们按照从小到大的全排列是 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 现在给你一个正整数n,n小于8,输出 ...
- Luogu P1991 无线通讯网 【最小生成树】
题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫星电话线路的哨所(两边都 ...
- iOS Debug心得 (持续更新)
最近在维护一个内部比较混乱的APP,Debug的时候遇到很多比较痛苦的地方, 因此做一个Debug记录,对以后的开发会有比较大的帮助: 这样,在开发新项目的时候就可以争取把一些BUG扼杀在襁褓中. & ...
- Windows7运行无法记录历史命令问题解决
Windows7运行无法记录历史命令,每次都需要手动敲命令,解决方法如下: 1.任务栏中右键,选择"属性"菜单: 2.在弹出框中的"[开始]菜单"选项卡的隐私区 ...
- Service官方教程(11)Bound Service示例之2-AIDL 定义跨进程接口并通信
Android Interface Definition Language (AIDL) 1.In this document Defining an AIDL Interface Create th ...
- 1354 选数字 DP背包 + 数学剪枝
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1354&judgeId=187448 其实这题和在若干个数字中,选 ...
- DLL线程中坑爹的Synchronize?
1, 缘起 某次开发语音对讲windows程序,采用delphi语言,及delphix的TDXSound控件. DXSound提供了TSoundCaptureStream类,可以实现指定频率.位数.声 ...
- Jvisualvm--JAVA性能分析工具
JDK自带的JAVA性能分析工具.它已经在你的JDK bin目录里了,只要你使用的是JDK1.6 Update7之后的版本.点击一下jvisualvm.exe图标它就可以运行了. 这里是VisualV ...
- win+r 快速命令
control keymgr.dll 打开凭据管理器 secpol.msc 本地安全策略 mstsc 远程 msconfig 启动选项 %temp% 临时文件夹 \\192.168 ...
- java web 学习笔记 - servlet03
1.Servlet可以分为三种类型 普通Servlet,需要在基本程序架构中体现. Servlet过滤器,在web容器启动时初始化,不需要手动调用. Servlet 监听器. 2. Servlet过 ...