抽象类
-
1.使用关键字: abstract
-
2.类中只要有一个方法声明为abstract抽象方法,那么这个类就必须声明为抽象类
-
3.抽象方法只允许有方法声明与参数列表,不允许有方法体;
-
4.因为抽象方法的不确定性,所以抽象类禁止实例化,仅允许通过继承来实例化;
-
5.继承抽象类的子类中,必须将抽象类中的所有抽象方法全部实现
-
6.子类成员的访问限制级别必须等于或小于抽象类的约定,例如抽象类是protected,子类必须是
-
protected 或者 public 不允许是private
-
7.子类方法参数必须与抽象类方法参数完全一致,但允许增加默认参数
-
特别注意
-
- 尽管抽象类不能实例化,但仍然可以为它创建构造器,但必须声明为final
-
- 抽象类理论上说不应该拥有静态成员,部分编辑器会有E_STRICT2048提示,但仍然可以这样做
<?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_', 'aaaa') ."\n";
//以下为静态属性和静态方法的情況
abstract class Person{
//人的姓名
protected static $name = 'aaa';
abstract public static function eat();
}
class Man extends Person{
protected static $name = 'Hello';
public static function eat(){
echo self::$name;
}
}
Man::eat();