1.php 接口类:【关键字】interface
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。 由于接口(interface)和类(class)、trait 共享了命名空间,所以它们不能重名。
接口就像定义一个标准的类一样,通过 interface
关键字替换掉 class
关键字来定义,但其中所有的方法都是空的。
接口中定义的所有方法都必须是公有,这是接口的特性。(这是php官方文档对它的描述)
比如 :
interface Connect
{
public function post($url,$data);
public function get($url);
}
上面定义了一个Connect接口类,定义了三个方法:post,get,那么继承此类的所有子类都必须实现这两个方法,如果子类没有实现这些话,就无法运行。
class AliConnect implements Connect
{
public function post($url,$data)
{
echo('发起了ali的post请求');
}
public function get($gid)
{
echo('发起了ali的get请求');
}
}
class wechatConnect implements Connect
{
public function post($url,$data)
{
echo('发起了wechat的post请求');
}
public function get($gid)
{
echo('发起了wechat的get请求');
}
}
结论 : 接口类就像是针对拥有相似业务但是有不同具体处理情况的时候使用。定义了他们之间一个通用的规范。
2.php 抽象类 : 【关键字】abstract
支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。 这也适用于 PHP 5.4 起的构造函数。在 PHP 5.4 之前的构造函数声明可以不一样的
abstract class AbstractConnect
{
abstract protected function get($url){}
abstract protected function post($url,$data){}
public function checkToken($token)
{
if(Redis::exist($token)){
return true;
}else{
return false;
}
}
}
class AliConnect extends AbstractConnect
{
protected function post($url,$data)
{
if( $this->checkToken('ali_token')){
echo('发起了ali的post请求');
}
}
protected function get($gid)
{
if( $this->checkToken('ali_token')){
echo('发起了ali的get请求');
}
}
}
class wechatConnect extends Connect
{
protected function post($url,$data)
{
if( $this->checkToken('wechat_token')){
echo('发起了wechat的post请求');
}
}
protected function get($gid)
{
if( $this->checkToken('wechat_token')){
echo('发起了wechat的get请求');
}
}
}
结论: 抽象类定义了哪些类是继承的子类必须要有的,但是对于那些具有同样操作的方法,就可以直接在抽象类中定义为普通方法,从而无需继承类在重新定义执行内容。