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' ;
}
?>