php抽象类特性实例详解

伊谢尔伦
发布: 2017-07-03 09:11:40
原创
2026人浏览过

抽象类的特性 

1、定义为抽象的类不能被实例化。
2、如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
3、被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
4、继承一个抽象类的时候,子类必须定义父类中的所有抽象方法(这些方法的访问控制必须和父类中一样(或者更为宽松)。)

demo

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)
    protected 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();
登录后复制

5、子类可以定义一个可选参数(也就是必须要有默认值),而父类抽象方法的声明里没有,则两者的声明并无冲突。

abstract class AbstractClass{
    // 我们的抽象方法仅需要定义需要的参数
    abstract protected function prefixName($name);
}

class ConcreteClass extends AbstractClass
{

    // 我们的子类可以定义父类签名中不存在的可选参数
    // 如果这里的$separator没有默认值,则会报Fatal error: 、、//Declaration of ConcreteClass::prefixName() must be //compatible with that of AbstractClass::prefixName()
    public function prefixName($name, $separator = ".") {
        if ($name == "Pacman") {            $prefix = "Mr";
        } elseif ($name == "Pacwoman") {            $prefix = "Mrs";
        } else {            $prefix = "";
        }        return "{$prefix}{$separator} {$name}";
    }
}

$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
登录后复制

6、抽象类可以没有抽象方法,反过来有抽象方法的类一定要声明为抽象类

abstract class A{
     public function show(){
         echo 'A';
     }
 } class B extends A{
     public function hello(){
         echo 'B';         
         parent::show();
     }
 } 
 $obj = new B; 
 $obj->hello(); // BA
登录后复制

7、抽象类定义的顺序

创客贴设计
创客贴设计

创客贴设计,一款智能在线设计工具,设计不求人,AI助你零基础完成专业设计!

创客贴设计 150
查看详情 创客贴设计

立即学习PHP免费学习笔记(深入)”;

// 正确的定义顺序
abstract class horse extends animal {
     public function get_breed() { return "Jersey"; }
 } 
 class cart extends horse {
     public function get_breed() { return "Wood"; }
 }
 // 错误的定义顺序,将会导致horse类找不到
 class cart extends horse {
     public function get_breed() { return "Wood"; }
 } 
 abstract class horse extends animal {
     public function get_breed() { return "Jersey"; }
 }
登录后复制

8、抽象方法可以为静态方法

abstract class FOO
{
     abstract static function dump();
 } 
 class BAR extends FOO{
     static function dump(){var_dump("BAR");}
 }
BAR::dump(); // string(3) "BAR"
登录后复制

9、一个抽象类继承另一个抽象类时,抽象方法不需要声明为抽象的

//Fatal error: Can't inherit abstract function //class1::someFunc() (previously declared abstract in //class2)abstract class class1 { 
   abstract public function someFunc(); 
 } 
 abstract class class2 extends class1 { 
   abstract public function someFunc(); 
 } 

//下面的是正确的
abstract class class1 { 
   abstract public function someFunc(); 
 } 
 abstract class class2 extends class1 { 
 }
登录后复制

以上就是php抽象类特性实例详解的详细内容,更多请关注php中文网其它相关文章!

相关标签:
php
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号