클래스의 특정 멤버를 다른 클래스에서 어떻게 사용할 수 있나요? 상속을 사용하면 상속 체인이 너무 길어집니다. 편의상 PHP는 코드 재사용 기술 특성을 제공합니다.
1. 정의 : Trait
는 PHP와 같은 단일 상속 언어
를 위해 준비된 코드 재사용 메커니즘입니다. 특성은 단일 상속 언어가 재사용을 위해 상속해야 하는 당황스러운 상황을 제거
하여 객체 지향
을 더 순수하게 만드는 데 도움이 될 수 있습니다. Trait
是为类似 PHP 的单继承语言
而准备的一种代码复用机制。trait可以使得单继承语言摆脱
为了复用,而不得不继承的尴尬处境,让面向对象
变得更加纯粹。
2.基础语法:
trait是一种类似class
的关键字。
<?php trait Eat{ public $a=10; //trait内允许有类的成员属性(包括静态属性),成员方法(包括静态方法) public static $b=666; //const c=3.14; //trait内不允许有常量 protected $e; //允许定义,但是实际不用 private $f; public function getA() { echo $this->a,"<br>"; } public static function getB() { echo self::$b,"<br>"; } } ?>
trait
是用来实现代码的复用的,不可以被实例化也不可以被继承(因为根本不是类)。
<?php trait Eat{} // $a=new Eat;//报错 //calss A extends Eat{}//报错 ?>
3.trait的使用
trait只是一段代码的集合,使用时必须要使用use
进行引用。
<?php trait Eat{ public $a=10; public static $b=666; //const c=3.14; public function getA() { echo $this->a,"<br>"; } public static function getB() { echo self::$b,"<br>"; } } class A{ use Eat; public function getC() { echo $this->a,"<br>"; } } $boy=new A(); $boy->getC(); $boy->getA(); $boy->getB(); ?>
一个类可以使用多个trait。
<?php trait A1{ } trait A2{ } class People{ use A1,A2; } ?>
4.trait使用的问题
a.如果同时引入的多个trait中有同名属性,那么会产生冲突。
<?php trait A1{ public $a=11; } trait A2{ public $a=22; } class A3{ use A1,A2;//不允许同名属性 public function geta(){ echo $this->a; } } $example=new A3(); ?>
b.如果同时引入的多个trait中有同名方法,那么会产生冲突,有两种方案解决如A3、A4。
<?php trait A1{ public $a=11; public function eat(){ echo "A1中eat()方法","<br>"; } } trait A2{ public $b=22; public function eat(){ echo "A2中eat()方法","<br>"; } } class A3{ use A1,A2{ A1::eat insteadOf A2; //A1中的eat替代A2中的eat } } class A4{ use A1,A2{ A1::eat insteadOf A2;//A1中的eat替代A2中的eat A2::eat as eat2; //A2中的eat取别名eat2 } } $example=new A3(); $example->eat(); $example=new A4(); $example->eat2(); ?>
c.同名覆盖问题:如果类中有与引入的trait同名成员,会有不同处理:
属性:不允许重名,即类中不允许定义与trait中同名的成员属性(静态属性也一样)。
方法:类覆盖trait。
d.继承覆盖问题:如果类中在使用trait
的同时,也是继承自父类,而trait中与父类中有同名方法,那么trait
中将覆盖父类同名方法;如果要访问父类方法,可以在trait同名方法中使用parent
关键字访问父类同名方法。
<?php trait Eat{ public function eat(){ echo 'Eat::eat'; } } class Human{ public function eat(){ echo 'Human::eat'; } } //子类继承父类同时使用trait class Man extends Human{ use Eat; } $m = new Man(); $m->eat(); ?>
e.trait自己不能访问,只是用来给其他类提供代码复用的,因此允许类在使用trait时,使用更高的访问控制权:在as
之后,使用目标访问修饰限定符。
<?php trait Eat{ private function show(){ echo 'eat'; } } class Human{ use Eat{ show as public eshow; //注意:as是用来设定别名的,虽然没有同名show,但是系统认为show已经存在,所以必须别名,权限的更改的方法不是 //本尊 } } $h = new Human(); $h->eshow(); //eat ?>
f.trait中可以使用抽象方法
,使用类必须实现对应抽象方法
2. 기본 구문 : Trait은 class
와 유사한 키워드입니다.
<?php trait Eat{ public function eat(); //抽象方法 } abstract class Human{ use Eat; //抽象类:可以不实现抽象方法 } class Animal{ use Eat; public function eat(){ //具体类:实现抽象方法 echo 'Animal::eat'; } } ?>
trait
는 코드 재사용을 위해 사용되며 클래스가 아니기 때문에 인스턴스화하거나 상속할 수 없습니다. 🎜rrreee🎜🎜 3. 특성의 사용 🎜🎜🎜 특성은 코드 모음일 뿐이며 use
를 사용하여 참조해야 합니다. trait
를 사용하는 경우 상위 클래스에서도 상속되며 해당 특성에는 상위 클래스와 동일한 이름의 메서드가 있습니다. 클래스를 사용하면 trait
는 상위 클래스의 메서드를 동일한 이름으로 덮어씁니다. 상위 클래스의 메서드에 액세스하려면 다음에서 parent
키워드를 사용할 수 있습니다. 동일한 이름을 가진 상위 클래스의 메소드에 액세스하려면 동일한 이름을 가진 특성 메소드를 사용하십시오. 🎜rrreee🎜 e.trait 자체에는 액세스할 수 없습니다. 이는 다른 클래스에 대한 코드 재사용을 제공하는 데만 사용됩니다. 따라서 클래스는 특성을 사용할 때 더 높은 액세스 제어를 사용할 수 있습니다. as
다음에 Target 액세스를 사용하세요. 수정자 한정자. 🎜rrreee🎜 f.trait에서 추상 메서드
를 사용할 수 있으며 사용 클래스는 해당 추상 메서드
를 구현해야 합니다. 사용 클래스는 추상 클래스이거나 추상 메소드를 구현해야 합니다. 🎜rrreee🎜추천: 🎜php 튜토리얼🎜, 🎜php 비디오 튜토리얼🎜🎜위 내용은 계속해서 숨이 막힐 정도로 반복하는데 나는 언제쯤 일어설 수 있을까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!