美文网首页
php中的abstract

php中的abstract

作者: PENG先森_晓宇 | 来源:发表于2019-12-27 16:43 被阅读0次
  • abstract属于类的修饰符。
  • 当abstract修饰某个类时,该类被定义为抽象类。
  • 抽象类不能被实例化,只能被继承
  • 抽象类中的方法可以有抽象方法,也可以有有结构体的普通方法。抽象方法为没有函数体的方法。
  • 抽象类中的抽象方法用abstract修饰,interface中的抽象方法是用public修饰。抽象方法不能使用private修饰,因为该修饰方法就是为了让子类去重写实现的,可以为public和protected修饰。
  • 抽象类中不一定有abstract的抽象方法,但有abstract的抽象方法的类肯定是抽象类或者是trait。抽象类内可以有普通类中的所有属性。
  • 子类如果继承了一个抽象类,则子类必须实现抽象类中的所有抽象方法,和interface类似。
  • 如果不实现父类中的抽象方法,那么子类也必须是抽象类
abstract class MyClass {
    abstract public function abstractFunc();
    abstract public function abstractFuncOther();
    
    public function index() {
    
    }
}

abstract class SubAbstract extends MyClass {
    //不实现父抽象类的抽象方法则自身必须为抽象类
}

抽象类和接口的使用场景

首先明确接口里的所有方法都是抽象方法,而抽象类中是可以定义有方法体的普通方法的。

由此可知:如果子类与子类之间完全没有关系,都是互相独立的,例如实现mysql类和redis类,俩个子类实现各自的接口即可。
而某些场合下,子类与子类之间是有关系的,只靠纯粹的接口是不能满足类与类之间协调的,此时这些子类就可以继承同一个抽象类,在该抽象类中的非抽象方法内实现相关子类的协调操作。

还有一种场合:子类与子类之间有一些共同点的,也有一些不同点(不同的子类实现的方法逻辑不一样),此时子类就可以继承同一个抽象类,在抽象类中的非抽象方法中实现子类之间的共同操作,而子类在继承了抽象类的抽象方法中实现属于自己的逻辑。

注意

trait内也是可以有abstract方法的。use了该trait的类必须实现trait内的抽象方法

<?php
namespace App\learn;

trait CsvTrait
{
    public function export(){
        //导出相关操作
        return 2;
    }
    abstract function ff();
}

调用CsvTrait

<?php
namespace App\learn;

class Csv
{
    use CsvTrait;
    
    public function ff(){
        return 22;
    }
}

相关文章

网友评论

      本文标题:php中的abstract

      本文链接:https://www.haomeiwen.com/subject/nhckoctx.html