天天看点

PHP使用抽象类

抽象类

  • 1.使用关键字: abstract
  • 2.类中只要有一个方法声明为abstract抽象方法,那么这个类就必须声明为抽象类
  • 3.抽象方法只允许有方法声明与参数列表,不允许有方法体;
  • 4.因为抽象方法的不确定性,所以抽象类禁止实例化,仅允许通过继承来实例化;
  • 5.继承抽象类的子类中,必须将抽象类中的所有抽象方法全部实现
  • 6.子类成员的访问限制级别必须等于或小于抽象类的约定,例如抽象类是protected,子类必须是
  • protected 或者 public 不允许是private
  • 7.子类方法参数必须与抽象类方法参数完全一致,但允许增加默认参数
  • 特别注意
    1. 尽管抽象类不能实例化,但仍然可以为它创建构造器,但必须声明为final
    1. 抽象类理论上说不应该拥有静态成员,部分编辑器会有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();