php的类中有2个比较特殊的类.. 抽象类和接口类
先来看看接口类的定义:
使用接口(interface),你可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
我们可以通过interface来定义一个接口,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
接口中定义的所有方法都必须是public,这是接口的特性。
要实现一个接口,可以使用implements操作符。类中必须实现接口中定义的所有方法,否则 会报一个fatal错误。如果要实现多个接口,可以用逗号来分隔多个接口的名称。
接口也可以继承,通过使用extends操作符。
接口类的代码如下:
<?php
interface a
{
public function foo();
}
interface b extends a
{
public function baz(Baz $baz);
}
// 正确写法
class c implements b
{
public function foo()
{
}
public function baz(Baz $baz)
{
}
}
// 错误写法会导致一个fatal error
class d implements b
{
public function foo()
{
}
}
?>
那么接口类有什么作用呢..其实可以把其想象为一个类的模板.所有继承接口的类
都需要实现接口中定义的所有方法.那么在多人合作的项目中.只需要定义好接口,那么你无需
在去看继承接口的子类的代码,就可以知道子类拥有了哪些方法.因为子类必须实现接口中
定义的所有方法.
至于php的抽象类,和接口类有一点类似
先来看定义:
PHP5支持抽象类和抽象方法。抽象类不能直接被实例化,你必须先继承该抽象类,然后再实例化子类。抽象类中 至少要包含一个抽象方法。如果类方法被声明为抽象的,那么其中就不能包括具体的功能实现。
继承一个抽象类的时候,子类必须实现抽象类中的所有抽象方法;另外,这些方法的可见性必须和抽象类中一样(或者更为宽松)。如果抽象类中某个抽象方法被声明为protected,那么子类中实现的方法就应该声明为protected或者public,而不 能定义为private。
抽象类的核心在于抽象方法.如果去掉抽象方法,抽象类就和普通的类没什么区别了.
代码如下:
<?php
abstract class AbstractClass
{
// 强制要求子类定义这些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// 普通方法(非抽象方法)
public function printOut() {
print $this->getValue() . "\n";
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
class ConcreteClass2 extends AbstractClass
{
public function getValue() {
return "ConcreteClass2";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass2";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";
$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."\n";
?>
运行后输出
ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2
抽象类的作用就在于当你想定义一个基类,并且这个基类会实现一些公共的方法供子类调用
但是有一些方法不同的子类有不同的实现方法时,就可以考虑使用抽象类了.