PHP 进阶之 抽象类(abstract)、接口(interface)、Trait(特征)_扶摇网络

我们只做利于SEO的网站

PHP 进阶之 抽象类(abstract)、接口(interface)、Trait(特征)

来源:扶摇网络 作者:网站建设/SEO优化专家 浏览: 发布日期:2021-04-29 13:56:15
[导读]:抽象类PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。抽象方法只能在抽象类中,抽象类中可以包含非抽象方法被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现继承一个抽象类的时候,子类必须定义父类中的所有抽象方法,另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。抽象方法给我们提供了一个很好的保护父类的方法class&...

抽象类


PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。


抽象方法只能在抽象类中,抽象类中可以包含非抽象方法


被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现


继承一个抽象类的时候,子类必须定义父类中的所有抽象方法,另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。


抽象方法给我们提供了一个很好的保护父类的方法


class Fruit { 
    private $color; 
    
    public function eat() { 
        //chew     } 
    
    public function setColor($c) { 
        $this->color = $c; 
    } 
} 

class Apple extends Fruit { 
    public function eat() { 
        //chew until core     } 
} 

class Orange extends Fruit { 
    public function eat() { 
        //peel 
        //chew     } 
}

上面定义了一个`水果父类` ,同时定义了两个子类`Apple`,`Orange`,此时

$apple = new Apple(); 
$apple->eat();     //实例化Apple类,调用eat方法,这没毛病$fruit = new Fruit();     
$fruit->eat();     //如果实例化Friut类,调用eat方法就有点奇怪了,What does that taste like???

抽象方法完美的解决了这个问题

abstract class Fruit { 
    private $color; 
    
    abstract public function eat(); 
    
    public function setColor($c) { 
        $this->color = $c; 
    } 
}

因此,如果我们需要一个类的子类都实现同一个方法,每个方法的实现方法都不同,此时可以使用抽象方法

 

接口


使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。


接口中只能定义方法名(含参数),不能有方法体


接口中定义的所有方法都必须是公有 (public)


要实现一个接口,使用 implements 操作符,类中必须实现接口中定义的所有方法


设计接口时如果不确定方法参数个数,可以使用 ...$argumens 可变参数代替,或者直接为空,子类中通过传入可变参数或者通过 func_get_args 获取


一个类可以同时实现多个接口,实现多个接口时,接口中的方法不能有重名


接口也可以继承,通过使用 extends 操作符


接口中也可以定义常量


通过接口我们可以很好的降低代码的耦合性


例如:

我有一个数据库,我想写一个类去访问我的数据库,所以我定义了一个接口

interface Database {function listOrders():array;    //要求次方法返回的数组function addOrder(array $arr);      //要求次方法参数类型为数组function removeOrder();...}

现在我们使用MYSQL数据库,所以我写了一个mysql的类

class MySqlDatabase implements Database {function listOrders() :array{...}

过了一段时间,我们又想改成Oracle数据库,我们又写了一个oracle数据库类去实现接口

class OracleDatabase implements Database {public function listOrders() :array{...}

因为我们使用了接口,所有的方法(参数、返回值)都一致,我们只需要修改一行代码即可完成切换

$database = new OracleDatabase();

 

Trait

从PHP的5.4.0版本开始,PHP提供了一种全新的代码复用的概念,那就是Trait。Trait其字面意思是”特性”、”特点”,我们可以理解为,使用Trait关键字,可以为PHP中的类添加新的特性。 

熟悉面向对象的都知道,软件开发中常用的代码复用有继承和多态两种方式。在PHP中,只能实现单继承。而Trait则避免了这点。下面通过简单的额例子来进行对比说明。 

trait ezcReflectionReturnInfo {    function getReturnType() { /*1*/ }    function getReturnDescription() { /*2*/ }
}class ezcReflectionMethod extends ReflectionMethod {    use ezcReflectionReturnInfo;    /* ... */}class ezcReflectionFunction extends ReflectionFunction {    use ezcReflectionReturnInfo;    /* ... */}

声明一个trait 直接使用 trait 关键字 + 类名即可 , 与声明一个类相似

使用trait 使用关键字 use + 类名

注意:从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。


大家有疑问,可以在下边留言交流,我有空会及时回复,本人英文网名:Cheng,中文网名:陆小凤。
免责声明:本文由专注多年品牌设计公司扶摇网络整理编写,旨在为企业提供网络知识分享,如有侵权请联系删除,转栽请注明出处.
加载中~
微信咨询网站建设

扫一扫高效沟通

访问网站建设手机端

扫描访问手机网站

多一份参考总有益处

免费领取网站策划SEO优化策划方案

请填写下方表单,我们会尽快与您联系
感谢您的咨询,我们会尽快给您回复!