目录
基础使用方法
优先级
Trait冲突问题
方法访问控制
Trait嵌套使用
变量、属性、方法定义
对比javascript
首页 后端开发 php教程 php中关于traits复用机制的使用详解

php中关于traits复用机制的使用详解

Sep 08, 2017 am 09:37 AM
php traits 使用

提到 php 的代码复用,我们可能第一时间会想到继承,但是这种单继承语言一旦派生的子类过多,那么会产生一系列的问题,比如依赖父类、耦合性太大、破坏了类的封装性。那么有没有更好的方法来实现代码复用呢?

自 PHP 5.4.0 起,PHP 实现了另外一种代码复用的一个方法,称为 traits。

Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。

基础使用方法

Traits 的使用非常简单,只需要在类中使用 use 关键字即可。

1

2

3

4

5

6

trait A {    public function test() {

        echo 'trait A::test()';

    }

}class b {

    use A;

}$b=new b();$b->test();

登录后复制

优先级

简单来说 Trait 优先级大于父类方法,但是小于当前类方法。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

trait A {    public function test() {

        echo 'trait A::test()';

    }    public function test1() {

        echo 'trait A::test1()';

    }   

}class base{

    public function test(){

        echo 'base::test()';

    }    public function test1(){

        echo 'base::test1()';

    }   

}class b extends base{

    use A;    public function test(){

        echo 'b::test()';

    }

}$b=new b();$b->test();//b::test()$b->test1();//trait A::test1()

登录后复制

Trait冲突问题

在使用多个 Trait 时,如果其中存在相同的方法名称,那么就会产生冲突。使用 insteadof 和 as 可以解决方法名称冲突问题

insteadof可以声明使用两个相同方法名称中的具体某个方法。

1

2

3

4

5

6

7

8

9

10

11

trait A {    public function test() {

        echo 'trait A::test()';

    }

}trait B {    public function test() {

        echo 'trait B::test()';

    }

}class c{

    use A,B{        A::test insteadof B;//使用 insteadof 明确使用哪个方法

        B::test as testB;//使用 as 修改另外一个方法名称,必须在使用 insteadof 解决冲突后使用

    }

}$c=new c();$c->test();//trait A::test()$c->testB();//trait B::test()

登录后复制

方法访问控制

使用 as 关键字我们可以对 trait 方法的访问权限进行修改

1

2

3

4

5

6

7

8

9

10

11

trait A {    public function test() {

        echo 'trait A::test()';

    }

    private function test1(){

        echo 'trait A::test1()';

    }

}class b{

    use A{        test as protected;

        test1 as public test2;//更改权限时还可以修改名称

    }

}$b=new b();$b->test();//Fatal error: Call to protected method b::test()$b->test2();//trait A::test1()

登录后复制

Trait嵌套使用

1

2

3

4

5

6

7

8

9

10

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

登录后复制

变量、属性、方法定义

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

1

2

3

4

5

6

7

trait A {      

public $test1;

   }    class B {

       use A;       

       public $test;       

       public $test1;//Strict Standards: B and A define the same property ($test1) in the composition of B...

   }

登录后复制

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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

登录后复制

对比javascript

这种 trait use 的使用方法大概和 javascript 中的 call 有点相似,都是把一个另外一个对象挂载到当前对象的执行环境当中。当然 javascript 是基于原型的语言。两者也没有可比性。仅仅是使用方法相差无几,有助于理解。

1

2

3

4

5

6

7

8

9

function a() {

    this.name="a";    this.getName=function(){

        console.log(this.name);

    }

}function b(){

    this.name="b";

    a.call(this);

}var b = new b();    

b.getName();//a

登录后复制

以上是php中关于traits复用机制的使用详解的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章标签

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南

CakePHP 日期和时间 CakePHP 日期和时间 Sep 10, 2024 pm 05:27 PM

CakePHP 日期和时间

CakePHP 项目配置 CakePHP 项目配置 Sep 10, 2024 pm 05:25 PM

CakePHP 项目配置

CakePHP 文件上传 CakePHP 文件上传 Sep 10, 2024 pm 05:27 PM

CakePHP 文件上传

CakePHP 路由 CakePHP 路由 Sep 10, 2024 pm 05:25 PM

CakePHP 路由

讨论 CakePHP 讨论 CakePHP Sep 10, 2024 pm 05:28 PM

讨论 CakePHP

如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 Dec 20, 2024 am 11:31 AM

如何设置 Visual Studio Code (VS Code) 进行 PHP 开发

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

CakePHP 快速指南

See all articles