抽象类

定义为抽象的类可能无法直接被实例化,任何一个类, 如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。如果类方法被声明为抽象的, 那么其中就不能包括具体的功能实现。

<?php

abstract class Say
{
    abstract public function sayHello($word);
    abstract public function sayHi();
}

class Speak extends Say
{
    public function sayHello($word)
    {
        echo "Hello $word";
    }

    public function sayHi()
    {
        echo "Hi".PHP_EOL;
    }
}

$s = new Speak();
$s->sayHi();
$s->sayHello("World");

结果输出

Hi
Hello World

从结果可以看出

  • 继承一个抽象类的时候,子类必须定义父类中的所有抽象方法。例如,在类 Speak 中移除方法 sayHi(),结果为
Fatal error: Class Speak contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Say::sayHi)...
  • 这些方法的访问控制必须和父类中一样(或者更为宽松)。例如,在类 Speak 中 sayHi() 声明为 protected,则报错
Fatal error: Access level to Speak::sayHi() must be public (as in class Say)...
  • 此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,移除抽象方法 sayHello() 中的参数,则
Fatal error: Declaration of Speak::sayHello($word) must be compatible with Say::sayHello()...

接口

使用接口(interface),你可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。我们可以通过 interface 来定义一个接口,就像定义一个标准的类一样,但其中定义所有的方法都是空的。 接口中定义的所有方法都必须是public,这是接口的特性。

实现

要实现一个接口,可以使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个 fatal 错误。如果要实现多个接口,可以用逗号来分隔多个接口的名称。

<?php

interface A
{
    public function actionA();
}

interface B
{
    public function actionB();
}

//实现多个接口
class C implements A, B
{
    public function actionA()
    {
        //do something
    }
    public function actionB()
    {
        //do something
    }
}

注意:

  • 实现多个接口时,接口中的方法不能有重名。
  • 接口也可以继承,通过使用 extends 操作符。
<?php

interface A
{
    public function actionA();
}

interface B extends A
{
    public function actionB();
}

class C implements A
{
    public function actionA()
    {
        //do something
    }
    public function actionB()
    {
        //do something
    }
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。