🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
什么是抽象类 > 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类 抽象类的特性 1. 定义为抽象的类不能被实例化 2. 如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的 3. 被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现 4. 继承一个抽象类的时候,子类必须定义父类中的所有抽象方法(这些方法的访问控制必须和父类中一样(或者更为宽松)) 5. 子类可以定义一个可选参数(**也就是必须要有默认值**),而父类抽象方法的声明里没有,则两者的声明并无冲突 6. 抽象类可以没有抽象方法,反过来有抽象方法的类一定要声明为抽象类 7. 抽象方法可以为静态方法 ~~~ <?php abstract class AbstractClass { // 强制要求子类定义这些方法 abstract protected function getValue(); abstract protected function prefixValue($prefix); // 普通方法(非抽象方法) public function printOut() { print $this->getValue() . "\n"; } } class ConcreteClass1 extends AbstractClass { //父类定义了俩个抽象方法,如子类只实现了其中一个,则报如下错误 //Fatal error: Class ConcreteClass1 contains 1 abstract //method and must therefore be declared abstract or //implement the remaining methods //(AbstractClass::prefixValue) public function getValue() { return "ConcreteClass1"; } // 且子类的访问权限不能低于父类,如果将如下子类的访问方式改为private则会报如下错误 //Fatal error: Access level to //ConcreteClass1::prefixValue() must be protected (as in //class AbstractClass) or weaker public function prefixValue($prefix) { return "{$prefix}ConcreteClass1"; } } //当实例化一个抽象类时,Fatal error: Cannot instantiate //abstract class AbstractClass //$obj = new AbstractClass(); // 但是我们可以这么使用 ########################################################## abstract class Foo { static function bar() { echo "test\n"; } } Foo::bar(); ########################################################## $obj = new ConcreteClass1(); echo $obj->getValue(); ~~~ 文章来源: http://blog.csdn.net/fationyyk/article/details/51005929