PHP抽象类

转载 2013年12月02日 15:53:18

抽象类 

PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。 这也适用于 PHP 5.4 起的构造函数。在 PHP 5.4 之前的构造函数声明可以不一样的。

Example #1 抽象类示例

<?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_') ."\n";
?>

以上例程会输出:

ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2

Example #2 抽象类示例

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

}

class 
ConcreteClass extends AbstractClass
{

    
// 我们的子类可以定义父类签名中不存在的可选参数
    
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";
?>

以上例程会输出:

Mr. Pacman
Mrs. Pacwoman

老代码中如果没有自定义类或函数被命名为“abstract”,则应该能不加修改地正常运行。

PHP面向对象基础概念(抽象方法和抽象类)

在OOP语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法做为外部代码访问其的接口。而抽象方法就是为了方便继承而引入的,我们先来看一下抽象类和抽象方法的定义再说明它的用途。 什么是抽象方...
  • PHPwhite
  • PHPwhite
  • 2015年06月15日 23:40
  • 2475

PHP中抽象方法、抽象类和接口的用法

1. 抽象方法 在类中,没有方法体的方法就是抽象方法。 abstract 可见性 function 方法名称(参数1,.....);      // 如果没有显示地指定可见性,则默认为publ...
  • lamp_yang_3533
  • lamp_yang_3533
  • 2016年03月08日 20:29
  • 3098

php中抽象类和接口的区别

php中抽象类和接口的区别    1) 概念          面向对象的三大概念:封装,继承,多态        把属性和方法封装起来就是类。       一个类的属性和方法被另外的类复制就是...
  • Sunny_LG
  • Sunny_LG
  • 2016年06月22日 21:23
  • 1293

对php的接口类与抽象类的理解

今天有个小兄弟问我,php里面的接口类,抽象类到底有什么用呢,他完全不会用,觉得用也没有什么意思,其实和他的想法是一样的,在我才接触 php的时候,也觉得这个东西没有什么用,在后来的逐渐接触大系统以后...
  • likunlun1234
  • likunlun1234
  • 2015年01月14日 16:01
  • 429

PHP抽象类:无法实例化

一、抽象类: 无法实例化 类前加 abstract, 此类就成为抽象类,无法实例化. 举例: 春秋战国时期,燕零七 飞行器专家,能工巧匠.他写了一份图纸---【飞行器制造术】 飞行器秘制图...
  • kaituozheboke
  • kaituozheboke
  • 2016年08月11日 16:18
  • 1655

PHP中抽象类与接口的应用场景

/***   ====笔记部分====   接口的具体语法:   0:以人类为, class Human 是人的草图   而接口 是零件   可以用多种零件组合出一种新特种来.   1: ...
  • hanliuxinming
  • hanliuxinming
  • 2014年03月10日 01:02
  • 1227

php面向对象(三),抽象类,抽象方法,接口及php的”重载“

抽象类 定义:一个抽象的不能被实例化的类。 定义形式(abstract关键字):abstract class 类名{ // ... } 抽象方法 定义:一个只有方法头,没有方法体的方法 定义形...
  • ydxlt
  • ydxlt
  • 2016年02月15日 11:52
  • 2839

PHP中的抽象类和接口

抽象类 PHP5支持抽象类和抽象方法,类前加abstract,此类变成了抽象类,无法被实例化,此类天生就是用来被继承的,给子类提供一个模板; 方法前加abstract,是抽象方法,抽象方法不能有方...
  • qq_29631251
  • qq_29631251
  • 2017年01月13日 16:31
  • 223

php中抽象类和接口的概念与区别

php里面的接口类,抽象类到底有什么用呢?  在我才接触php的时候,觉得这个东西没有什么用,在后来的逐渐接触大系统以后,才发现其实这些东西还是有一定的作用的,下面我就简单的说说。   1.php...
  • u011829023
  • u011829023
  • 2016年02月19日 11:56
  • 499

PHP类的继承和接口

PHP类的继承的一些语法-PHP的类只支持单继承,就是每个类最多只能有一个父类或者没有父类。-子类不能继承父类使用private修饰的成员。 修饰符 可访问范围 public 当前类、子...
  • u014044821
  • u014044821
  • 2015年06月04日 19:19
  • 2363
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PHP抽象类
举报原因:
原因补充:

(最多只允许输入30个字)