php - trait 1372次阅读 php 2022-10-19 > 本质上trait本身是对类的一个扩展,在trait中使用$this ,self,static,parent都与当前类一样,***zend底层将trait代码嵌入到类当中***,相当于底层帮我们实现了代码复制功能 ##### trait、继承和实例化的区别: 对于当前一个类需要用到另一个或多个类的方法的情况,我们一般会想到的方式有继承、直接实例化另外一个或多个类等等的方法,下面来对比一下这些方法和Trait类的区别: 1. 继承方式:对于继承,可以完美地复用另一个类的一些方法,但是对于需要复用多个类的方法时,PHP是不支持多继承的,而且只能访问public和protected方法; 2. 与直接实例化的区别:我们也可以在当前类中直接实例化要用到的A类与B类,但是这种方法在控制访问范围反面,只允许访问A、B类中public的方法; 3. 使用Trait类则完全将A、B两个类的方法导入到当前类中,可以视为当前类的一部分,唯一区别是可以存在于当前类同名的方法,此时由优先级顺序来控制。 ##### 调用 1. 当前类, 可以直接调用 trait 中的所有方法和属性(因为相当于调用的是当前类中的属性和方法,所以trait 中的私有方法和属性都可以被调用) 2. 当前类的子类不可以调用 trait 中的私有方法和属性 3. 当前类和 trait 类中的方法会被重写, 但属性不会, 如果当前类和 trait 类中包含相同的属性则会报错. 但是当前类的子类的属性可以和 trait 里重复 4. 方法重复时的调用顺序: 当前类 > trait类> 父类 #### 其他 1. 同一个类中可以同时trait 多个类 2. Trait 中还支持定义抽象方法和静态方法,其中抽象方法必须在使用它的类中实现 3. 如果引入的 trait 类中有方法重复了会报错, 解决方案: 1. insteadof: 通过该关键字指定方法名冲突时该使用哪个Trait类的方法 ``` use A, B { B::a insteadof A; //a方法冲突时使用B类的a方法而不使用A类的a方法 A::b insteadof B; //b方法冲突时使用A类的b方法而不使用B类的b方法 } ``` 2. as: 通过as关键字将同名方法指定为一个别名,且仅作用于当前类中 ``` use A, B { B::a as c; //声明B类的a方法为c,作用于该类 A::b as d; //声明A类的b方法为d,作用于该类 } ``` WechatAlipay手机上阅读 最后一次更新于2022-10-19 php trait
#### 废话文学
- 文学1
> 随机一段废话似乎是一种巧合,但如果我们从一个更大的角度看待问题,这似乎是一种不可避免的事实. 要想清楚, 随机一段废话, 到底是一种怎么样的存在. 在这种不可避免的冲突下,我们必须解决这个问题. 了解清楚随机一段废话到底是一种怎么样的存在, 是解决一切问题的关键.既然如何, 马云说过一句著名的话, 最大的挑战和突破在于用人,而用人最大的突破在于信任人。这启发了我. 我们不妨可以这样来想: 了解清楚
By wujingfeng at May 17th, 2023 at 03:34 pm.
@wujingfeng
千秋万代驱动器我的期待
By wujingfeng at May 17th, 2023 at 03:35 pm.
@wujingfeng
垃圾评论
By wujingfeng at May 17th, 2023 at 03:35 pm.
|´・ω・)ノ
By wujingfeng at May 17th, 2023 at 03:33 pm.
@wujingfeng
23让3让3人
By wujingfeng at May 17th, 2023 at 03:37 pm.