PHP抽象类:
1不能被实例化
2所有的子类必须定义其方法
3子类的方法的访问控制必须大于等于父类
4子类方法的参数也必须和父类一致,但是子类可以增加新的参数
<?php
abstract class A
{
// 强制要求子类定义这些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// 普通方法(非抽象方法)
public function printOut() {
print $this->getValue() . "\n";
}
}
class B extends A
{
protected function getValue() {
return "A";
}
public function prefixValue($prefix) {
return "{$prefix}A";
}
}
class C extends A
{
public function getValue() {
return "B";
}
public function prefixValue($prefix,$separator = "_Hello") {
return "{$prefix}B{$separator}";
}
}
$class1 = new B;
$class1->printOut();
//A
// B调用父类的printOut方法,父类的$this是B的伪类,然后调用B的getvalue方法,因为父类是保护方法,方法一致,输出A
echo $class1->prefixValue('FOO_') ."\n";
// FOO_A
//B调用prefixValue方法(public),传入参数FOO_,父类的prefixValue(protected),
//访问控制B->prefixValue[PUBLIC] > B->prefixValue[PROTECTED] 满足,可以输出
$class2 = new C;
$class2->printOut();
//B
//前面同上面A结果。 虽然A类的getValue为保护,但是 C类的getValue为公共。访问控制大于A类,所以满足
echo $class2->prefixValue('FOO_') ."\n";
//FOO_B_Hello
效果同上面FOO_A 。子类是可以在必须满足父类的参数条件下,自己额外定义参数的。
一般代码哪些地方能用到?
我一般在写接口的基类会用到此类