批改状态:合格
老师批语:接口之间允许多继承, 类不行, 而trait 正好可以弥补这个短板, 不得不说, php的设计者真是贴心
使用接口(interface):可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
//继承单个接口interface monitor{const name = '张希希';}class myclass implements monitor//通过类来实现这个接口{public function write(){return myclass::name . '是我们的班长';}}echo (new myclass)->write();echo '<hr>';//继承多个接口interface monitor2{const name = '李原丁';}interface chargeman extends monitor2{const class1 = '五一班';}class myclass2 implements chargeman{public function write(){return monitor2::name . '是' .chargeman::class1 . '的班长。';}}echo (new myclass2)->write();echo '<hr>';

因为php是一种单继承语言,那么我们需要继承多个类的时候怎么办呢?于是php给了我们一个工具,就是“Trait”。
Trait:基本功能是,为类似 PHP 的单继承语言而准备的一种代码复用机制。我们仅仅需要在类中用use声明多个trait,这样当前类中的同名方法覆盖trait,而trait又覆盖基类中的同名方法,属性也是一样的。
如:
trait Hi{public function sayHi() {echo 'Hi, baby!';}}class Hy {use Hi;public function sayHi() {echo 'Hi , Girl!';}}$a = new Hy();$a->sayHi();
输出:
如:
trait first_trait {function first_method(){echo $number = '1250,';}}trait second_trait {function second_method(){echo $number = '2';}}class first_class {use first_trait,second_trait;}$a = new first_class();$a->first_method();$a->second_method();
输出:
如:
trait Hi{public function sayHi1() {echo 'Hi, baby!';}}class Hy {use Hi;public function sayHi2() {echo 'Hi , Girl!';}}class Ha {use Hi;public function sayHi3() {echo 'Hi , Boy!';}}class Hb {use Hi;public function sayHi4() {echo 'Hi , Anna!';}}$a = new Hy();$b = new Ha();$c = new Hb();$a->sayHi1();$b->sayHi1();$c->sayHi1();?>
输出:
trait first_trait {function first_method(){echo $name1 = '张秀英 ';}}trait second_trait {use first_trait;function second_method(){echo $name2 = '& 赵云珂';}}class first_class {use second_trait;}$a = new first_class();$a->first_method();$a->second_method();
输出:
如:
trait first_trait{function first_method(){echo $number = '50';}//这里可以加入修饰符,说明调用类必须实现它abstract public function second_method();}class first_class{use first_trait;function second_method(){echo $str = '这个数字是正确的。';}}$a = new first_class();$a->first_method();$a->second_method();
输出:
每个类的定义都以关键字 class 开头,一个类可以包含有属于自己的常量,变量(称为“属性”)以及函数(称为“方法”)。每个接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的,这点类似于抽象类。每个trait都是通过trait关键字来定义的,与class类似,但仅仅旨在用细粒度和一致的方式来组合功能。无法通过 trait 自身来实例化,这点类似于抽象类。class、interface、trait都可以实现并列、嵌套。interface、trait都需要通过class类来实例化。多个class类可以同时调用一个trait,但是这几个类之间不需要继承。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号