PHP中的traits实现代码复用使用实例

   这篇文章主要介绍了PHP中的traits实现代码复用使用实例,本文讲解了Trait简单使用、优先级问题、多个Trait冲突问题、as可用来修改方法访问控制、Trait中使用Trait等内容,需要的朋友可以参考下

  PHP5.4后新增traits实现代码复用机制,Trait和类相似,但不能被实例化,无需继承,只需要在类中使用关键词use引入即可,可引入多个Traits,用','隔开。

  (1)Trait简单使用

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

<?php
 
trait A {
public $var1 = 'test1';
public function test1() {
echo 'trait A::test1()';
}
}
 
trait B {
public $var2 = 'test2';
public function test2() {
echo 'trait B::test2()';
}
}
 
class C {
use A,B;
}
 
$c = new C();
echo $c->var1; //test1
$c->test2(); //trait B::test2()

  (2)优先级问题

  Trait会覆盖继承的方法,当前类会覆盖Trait方法。

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

trait A {
public $var1 = 'test';
public function test() {
echo 'A::test()';
}
public function test1() {
echo 'A::test1()';
}
}
 
class B {
public function test() {
echo 'B::test()';
}
public function test1() {
echo 'B::test1()';
}
}
class C extends B{
use A;
public function test() {
echo 'c::test()';
}
}
 
$c = new C();
$c->test(); //c::test()
$c->test1(); //A::test1()

  (3)多个Trait冲突问题

  如果没有解决冲突,会产生致命错误;

  可用insteadof来明确使用冲突中哪一个方法;

  可用as操作符将其中一个冲突方法另起名;

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

trait A {
public function test() {
echo 'A::test()';
}
}
 
trait B {
public function test() {
echo 'B::test()';
}
}
 
class C {
use A,B {
B::test insteadof A;
B::test as t;
}
}
 
$c = new C();
$c->test(); //B::test()
$c->t(); //B::test() 可以用as另起名

  (4)as可用来修改方法访问控制

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

trait HelloWorld {
public function sayHello () {
echo 'Hello World!' ;
}
}
 
// 修改 sayHello 的访问控制
class A {
use HelloWorld { sayHello as protected; }
}
 
// 给方法一个改变了访问控制的别名
// 原版 sayHello 的访问控制则没有发生变化
class B {
use HelloWorld { sayHello as private myPrivateHello ; }
}
 
$b = new A();
$b->sayHello(); //Fatal error: Call to protected method A::sayHello() from context ''

  (5)Trait中使用Trait

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

trait A {
public function test1() {
echo 'test1';
}
}
 
trait B {
public function test2() {
echo 'test2';
}
}
 
trait C {
use A,B;
}
 
class D {
use C;
}
 
$d = new D();
$d->test2(); //test2

  (6)Trait支持抽象方法、支持静态方法、不可以直接定义静态变量,但静态变量可被trait方法引用。

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

trait A {
public function test1() {
static $a = 0;
$a++;
echo $a;
}
 
abstract public function test2(); //可定义抽象方法
}
 
class B {
use A;
public function test2() {
 
}
}
 
$b = new B();
$b->test1(); //1
$b->test1(); //2

  (7)Trait可定义属性,但类中不能定义同样名称属性

  ?

1
2
3
4
5
6
7
8

trait A {
public $test1;
}
 
class B {
use A;
public $test2;  

时间: 2024-10-31 04:15:58

PHP中的traits实现代码复用使用实例的相关文章

PHP中的traits实现代码复用使用实例_php技巧

PHP5.4后新增traits实现代码复用机制,Trait和类相似,但不能被实例化,无需继承,只需要在类中使用关键词use引入即可,可引入多个Traits,用','隔开. (1)Trait简单使用 <?php trait A { public $var1 = 'test1'; public function test1() { echo 'trait A::test1()'; } } trait B { public $var2 = 'test2'; public function test2(

PHP使用traits实现代码复用的例子

PHP5.4后新增traits实现代码复用机制,Trait和类相似,但不能被实例化,无需继承,只需要在类中使用关键词use引入即可,可引入多个Traits,用','隔开. (1)Trait简单使用 <?php   trait A {     public $var1 = 'test1';     public function test1() {         echo 'trait A::test1()';     } }   trait B {     public $var2 = 'te

JavaScript代码复用模式实例分析_javascript技巧

任何编程都提出代码复用,否则话每次开发一个新程序或者写一个新功能都要全新编写的话,那就歇菜了,但是代码复用也是有好要坏,接下来的两篇文章我们将针对代码复用来进行讨论,第一篇文避免篇,指的是要尽量避免使用这些模式,因为或多或少有带来一些问题:第二排是推荐篇,指的是推荐大家使用的模式,一般不会有什么问题. 模式1:默认模式 代码复用大家常用的默认模式,往往是有问题的,该模式使用Parent()的构造函数创建一个对象,并且将该对象赋值给Child()的原型.我们看一下代码: 复制代码 代码如下: fu

PHP 实现代码复用的一个方法 traits新特性

 这篇文章主要介绍了PHP 实现代码复用的一个方法,traits的新特性的相关资料,需要的朋友可以参考下     在阅读yii2源码的时候接触到了trait,就学习了一下,写下博客记录一下. 自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits. Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制.Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集.Traits 和类组合的语义是定义了一种方式来减少复杂性,

PHP 实现代码复用的一个方法 traits新特性_php技巧

在阅读yii2源码的时候接触到了trait,就学习了一下,写下博客记录一下. 自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits. Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制.Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集.Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题. Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组

在Eclipse中的Android项目里实现代码复用

引言 开发时通常都会有多个项目间代码复用的需求,这时通常的做法是设置项目依赖,让一个项目引用另一个项目,比如在Visual Studio中这样就很容易实现. 而在Eclipse中的Android项目里,如果要引用另一个项目,理论上应该也使用类似的办法: 这里是引用一个名为Core的项目.这样做下来,在编写代码时不会有问题,但是在模拟器中运行时就会出现NoClassDefFoundError异常,原因是找不到引用项目中的类.而通过此窗口中Libraries选项卡中的各种功能添加引用,通常得到的结果

代码复用的规则

代码复用是绝大多数程序员所期望的,也是OO的目标之一.总结我多年的编码经验,为了使代码能够最大程度上复用,应该特别注意以下几个方面. 对接口编程 "对接口编程"是面向对象设计(OOD)的第一个基本原则.它的含义是:使用接口和同类型的组件通讯,即,对于所有完成相同功能的组件,应该抽象出一个接口,它们都实现该接口.具体到JAVA中,可以是接口(interface),或者是抽象类(abstract class),所有完成相同功能的组件都实现该接口,或者从该抽象类继承.我们的客户代码只应该和该

PHP中的traits简单使用实例

  这篇文章主要介绍了PHP中的traits简单使用实例,本文着重讲解traits的语法.traits有什么作用.什么情况下使用traits,需要的朋友可以参考下 PHP 5.4中的traits,是新引入的特性,中文还真不知道如何准确翻译好.其实际的目的,是为了有的场合想用多继承,但PHP又没多继承,于是就发明了这样的一个东西. Traits可以理解为一组能被不同的类都能调用到的方法集合,但Traits不是类!不能被实例化.先来例子看下语法: ? 1 2 3 4 5 6 7 8 9 10 11

JavaScript代码复用模式详解

 代码复用及其原则 代码复用,顾名思义就是对曾经编写过的代码的一部分甚至全部重新加以利用,从而构建新的程序.在谈及代码复用的时候,我们首先可以想到的是继承性.代码复用的原则是: 优先使用对象组合,而不是类继承 在js中,由于没有类的概念,因此实例的概念也就没多大意义,js中的对象是简单的键-值对,可以动态的创建和修改它们. 但在js中,我们可以使用构造函数和new操作符来实例化一个对象,这与其他使用类的编程语言在语法上有其相似之处. 例如: var trigkit4 = new Person()