UP | HOME

php面向对象abstract与interface

Table of Contents

abstract

  • 不能实例化
  • 使用 extends 继承
  • 一个类只能继承一个class 或 abstract class
  • 并非所有的方法都是抽象,只有abstract的方法(必须在子类实现)才是抽象方法,非抽象方法,子类可直接使用
  • 抽象类的抽象方法只能使用public 和 protected 修饰
<?php
abstract class A {

    //子类可直接使用
    public function v1() {
        echo "view A v1".PHP_EOL;
    }

    //子类可直接使用
    protected function v2() {
        echo "view A v2".PHP_EOL;
    }

    //不能使用private修饰,不然报错
    /*
    PHP Fatal error:  Abstract function A::v3() cannot be declared private
    */
    //abstract private function v3();

    //非抽象子类 一定需要实现,不然报错
    /*
    PHP Fatal error:  Class Aa contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (A::v4, A::v5) 
    */
    abstract public function v4();
    abstract protected function v5();
}

class B {

}


//不会报错
abstract class Ab extends A {

}

//一定要实现方法 v4 和 v5,不然报错
/*
PHP Fatal error:  Class Ac contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (A::v4, A::v5)
*/
/*
class Ac extends A {
}
*/

//一定要实现方法 v4 和 v5,不然报错
/*
PHP Fatal error:  Class Ad contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (A::v4, A::v5) 
*/
/*
class Ad extends Ab {
}
*/

//只能继承一个class 或 abstract class
class Aa extends A {

    public function v4() {
        echo "view A v4".PHP_EOL;
    }

    protected function v5() {
        echo "view A v5".PHP_EOL;
    }

    public function test() {
        $this->v1();
        $this->v2();
        //$this->v3();
        $this->v4();
        $this->v5();
    }
}

//不能实例化
/*
PHP Fatal error:  Uncaught Error: Cannot instantiate abstract class A 
*/
//$a = new A();
$a = new Aa();
$a->test();

interface

  • 不能实例化
  • 使用 implements 继承
  • 可以实现多个interface
  • 所有的方法都是抽象,子类必须实现
  • 抽象类的抽象方法只能使用public修饰
<?php
interface D {
    const NAME = "常量对象属性";

    public function v1();

    //必须实现,不然报错
    /*
    PHP Fatal error:  Class Da contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (D::v2) in
    */
    //public function v2();

    //只能使用public
    /*
    PHP Fatal error:  Access type for interface method D::v3() must be omitted
    */
    //protected function v3();
    //private function v4();
}

interface E {
    //虽然不报错,呵呵
    //public function v1();
    public function v5();
}

//可以多个interface 
class Da implements D, E {
    public function v1() {
        echo "view D v1".PHP_EOL;
    }

    public function v5() {
        echo "view D v5".PHP_EOL;
    }

    public function test() {
        $this->v1();
        $this->v5();
    }
}

$d = new Da();
$d->test();

区别

相同点

  • 属于抽象类,都不能实例化
  • interface所有的方法和abstract class的所有abstract 方法都必须在子类实现

不同点

  • 自己对比整理

备注

  • 实际项目中 abstract class 和 interface 是结合使用的
  • 实际项目中 abstract class 强调的是共性的所属关系,interface 强调的是差异化的功能实现

First created: 2020-02-22 16:49:41
Last updated: 2021-11-25 Thu 23:23
Power by Emacs 27.1 (Org mode 9.4)
© 2017 – 2021 by josephzeng