115.2 抽象类、接口和trait的区别

PHP 抽象类、接口和trait的区别
1.对接口的继承使用implements,抽象类使用extends.
2.接口中不可以声明变量,但可以声明类常量.抽象类中可以声明各种变量
3.接口没有构造函数,抽象类可以有
4.接口中只能声明public的方法,不能声明private和protected的方法,不能对方法进行实现
5.一个类可以继承多个接口,但只能继承一个抽象类
6.接口中每个方法都只有声明而没有实现,其中的每个方法实现类必须要实现;而抽象类中只需要实现抽象方法,其它方法可以选择性的实现;
7.trait是通过代码复用来实现具体功能扩展,trait无法实例化,在类中使用use关键字引用.

PHP 实现了一种代码复用的方法,称为 trait。

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

Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait
自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。
PHP 手册 语言参考 类与对象

总结:抽象类就是普通的类有的东西他都有,然后接口是一种契约,有很多限制,比如只能声明 public 方法,只能声明类常量,抽象类中只需要实现抽象方法,其他方法选择性实现。
rait 主要是为了便于类中代码的复用,提高了复用的灵活性,不然你都需要写到父类里面去,或者没有父类的类,你想复用个东西就会很麻烦。


应用与结合的例子:

<?php 
/* 
写此程序源于自己的猜测,想在抽象类里实现某一接口。 
*/ 
interface work{ 
  public function say(); 
}
abstract class a implements work{ 
  public function showlove(){ 
    echo 'love you<br />'; 
  } 
}
class b extends a{ 
  public function say(){ 
    echo 'hello, i m in b'; 
  } 
}
$k=new b(); 
$k->say();
/* 
以上程序能正常执行
普通类implements接口后,就变成了抽象类了,这就好像是直接给抽象类增加了一个抽象方法。
*/

二、接口与继承的结合
父类是普通类,子类继承后,同时在子类里实现接口。
疑问:这样的做法是否有意义,在实际开发中是否有这样的应用?

<?php
interface kk{ 
  public function say(); 
}
class a { 
  public function show(){ 
    echo '我是父类<br />'; 
  } 
}
class b extends a implements kk{ 
  public function say(){ 
    echo '我是继承A类,同时实现say接口的<br />'; 
  }
}
$b=new b(); 
$b->show();//我是父类
$b->say();//我是继承A类,同时实现say接口的

instdnceof关键字

PHP5的一个新成员是instdnceof关键字。
作用:
(1)判断一个对象是否是某个类的实例,

<?php
$obj = new A();
if ( $obj instanceof A) {
   echo 'A' ;
}

(2)判断一个对象是否实现了某个接口。

<?php
interface ExampleInterface
{
    public function interfaceMethod();
  }
  class ExampleClass implements ExampleInterface
{
    public function interfaceMethod()
    {
      return 'Hello World!' ;
    }
  }
$exampleInstance = new ExampleClass();
  if ( $exampleInstance instanceof ExampleInterface){
    echo 'Yes, it is' ;
  } else {
    echo 'No, it is not' ;
}
?>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值