Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:接口之间允许多继承, 类不行, 而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,但是这几个类之间不需要继承。