抽象类
定义为抽象的类可能无法直接被实例化,任何一个类, 如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。如果类方法被声明为抽象的, 那么其中就不能包括具体的功能实现。
<?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
}
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)