Home Backend Development PHP Tutorial PHP中trait的特征及作用

PHP中trait的特征及作用

Jun 06, 2016 pm 08:06 PM
php trait

本篇文章主要介绍了PHP中trait使用方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

说通俗点,PHP中使用trait关键字是为了解决一个类既想集成基类的属性和方法,又想拥有别的基类的方法,而trait一般情况下是和use搭配使用的。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<?php

  trait Drive {

    public $carName = &#39;trait&#39;;

    public function driving() {

      echo "driving {$this->carName}\n";

    }

  }

  class Person {

    public function eat() {

      echo "eat\n";

    }

  }

  class Student extends Person {

    use Drive;

    public function study() {

      echo "study\n";

    }

  }

  $student = new Student();

  $student->study();

  $student->eat();

  $student->driving();

 

?>

Copy after login

输出结果如下:

1

2

3

study

eat

driving trait

Copy after login

上面的例子中,Student类通过继承Person,有了eat方法,通过组合Drive,有了driving方法和属性carName。

如果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

<?php

  trait Drive {

    public function hello() {

      echo "hello drive\n";

    }

    public function driving() {

      echo "driving from drive\n";

    }

  }

  class Person {

    public function hello() {

      echo "hello person\n";

    }

    public function driving() {

      echo "driving from person\n";

    }

  }

  class Student extends Person {

    use Drive;

    public function hello() {

      echo "hello student\n";

    }

  }

  $student = new Student();

  $student->hello();

  $student->driving();

?>

Copy after login

输出结果如下:

1

2

hello student

driving from drive

Copy after login

因此得出结论:当方法或属性同名时,当前类中的方法会覆盖 trait的 方法,而 trait 的方法又覆盖了基类中的方法。

如果要组合多个Trait,通过逗号分隔 Trait名称:

1

use Trait1, Trait2;

Copy after login

如果多个Trait中包含同名方法或者属性时,会怎样呢?答案是当组合的多个Trait包含同名属性或者方法时,需要明确声明解决冲突,否则会产生一个致命错误。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<?php

trait Trait1 {

  public function hello() {

    echo "Trait1::hello\n";

  }

  public function hi() {

    echo "Trait1::hi\n";

  }

}

trait Trait2 {

  public function hello() {

    echo "Trait2::hello\n";

  }

  public function hi() {

    echo "Trait2::hi\n";

  }

}

class Class1 {

  use Trait1, Trait2;

}

?>

Copy after login

输出结果如下:

代码如下:

PHP Fatal error: Trait method hello has not been applied, because there are collisions with other trait methods on Class1 in ~/php54/trait_3.php on line 20

使用insteadof和as操作符来解决冲突,insteadof是使用某个方法替代另一个,而as是给方法取一个别名,具体用法请看代码:

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

29

30

31

32

33

34

35

36

37

38

39

40

41

<?php

trait Trait1 {

  public function hello() {

    echo "Trait1::hello\n";

  }

  public function hi() {

    echo "Trait1::hi\n";

  }

}

trait Trait2 {

  public function hello() {

    echo "Trait2::hello\n";

  }

  public function hi() {

    echo "Trait2::hi\n";

  }

}

class Class1 {

  use Trait1, Trait2 {

    Trait2::hello insteadof Trait1;

    Trait1::hi insteadof Trait2;

  }

}

class Class2 {

  use Trait1, Trait2 {

    Trait2::hello insteadof Trait1;

    Trait1::hi insteadof Trait2;

    Trait2::hi as hei;

    Trait1::hello as hehe;

  }

}

$Obj1 = new Class1();

$Obj1->hello();

$Obj1->hi();

echo "\n";

$Obj2 = new Class2();

$Obj2->hello();

$Obj2->hi();

$Obj2->hei();

$Obj2->hehe();

?>

Copy after login

输出结果如下:

1

2

3

4

5

6

7

Trait2::hello

Trait1::hi

 

Trait2::hello

Trait1::hi

Trait2::hi

Trait1::hello

Copy after login

as关键词还有另外一个用途,那就是修改方法的访问控制:

Trait 也能组合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

29

30

31

32

33

34

35

<?php

trait Hello {

  public function sayHello() {

    echo "Hello\n";

  }

}

trait World {

  use Hello;

  public function sayWorld() {

    echo "World\n";

  }

  abstract public function getWorld();

  public function inc() {

    static $c = 0;

    $c = $c + 1;

    echo "$c\n";

  }

  public static function doSomething() {

    echo "Doing something\n";

  }

}

class HelloWorld {

  use World;

  public function getWorld() {

    return &#39;get World&#39;;

  }

}

$Obj = new HelloWorld();

$Obj->sayHello();

$Obj->sayWorld();

echo $Obj->getWorld() . "\n";

HelloWorld::doSomething();

$Obj->inc();

$Obj->inc();

?>

Copy after login

输出结果如下:

1

2

3

4

5

6

Hello

World

get World

Doing something

1

2

Copy after login

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
2 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
2 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

CakePHP Project Configuration CakePHP Project Configuration Sep 10, 2024 pm 05:25 PM

In this chapter, we will understand the Environment Variables, General Configuration, Database Configuration and Email Configuration in CakePHP.

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

CakePHP Date and Time CakePHP Date and Time Sep 10, 2024 pm 05:27 PM

To work with date and time in cakephp4, we are going to make use of the available FrozenTime class.

CakePHP File upload CakePHP File upload Sep 10, 2024 pm 05:27 PM

To work on file upload we are going to use the form helper. Here, is an example for file upload.

CakePHP Routing CakePHP Routing Sep 10, 2024 pm 05:25 PM

In this chapter, we are going to learn the following topics related to routing ?

Discuss CakePHP Discuss CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP is an open-source framework for PHP. It is intended to make developing, deploying and maintaining applications much easier. CakePHP is based on a MVC-like architecture that is both powerful and easy to grasp. Models, Views, and Controllers gu

CakePHP Working with Database CakePHP Working with Database Sep 10, 2024 pm 05:25 PM

Working with database in CakePHP is very easy. We will understand the CRUD (Create, Read, Update, Delete) operations in this chapter.

CakePHP Creating Validators CakePHP Creating Validators Sep 10, 2024 pm 05:26 PM

Validator can be created by adding the following two lines in the controller.

See all articles