PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程

1、PHP中的抽象类

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

可以这样理解,抽象类作为一个基类,它把特定的细节留给继承者来实现。通过抽象概念,可以在开发项目中创建扩展性很好的架构。

代码如下:

abstract class AbstractClass
{
    code...
}

1.1、抽象方法

使用 abstract 关键字定义抽象方法。抽象方法只保留方法原型(方法的定义中剔除了方法体之后的签名),它包括存取级别、函数关键字、函数名称和参数。他不包含({})或者括号内部的任何代码。例如下面的代码就是一个抽象方法定义:

代码如下:

abstract public function prototypeName($protoParam);

继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。

1.2、关于抽象类

某个类只要包含至少一个抽象方法就必须声明为抽象类
声明为抽象的方法,在实现的时候必须包含相同的或者更低的访问级别。
不能使用 new 关键字创建抽象类的实例。
被声明为抽象的方法不能包含函数体。
如果将扩展的类也声明为抽象类,在扩展抽象类时,可以不用实现所有的抽象方法。(如果某个类从抽象类继承,当它没有实现基类中所声明的所有抽象方法时,它就必须也被声明为抽象的。)
1.3、使用抽象类

代码如下:

<?php
abstract class Car
{   
    abstract function getMaxSpeend();
}
class Roadster extends Car
{
    public $Speend;
    public function SetSpeend($speend = 0)
    {
        $this->Speend = $speend;
    }
    public function getMaxSpeend()
    {
        return $this->Speend;
    }
}
class Street
{
    public $Cars ;
    public $SpeendLimit ;
    function __construct( $speendLimit = 200)
    {
        $this -> SpeendLimit = $speendLimit;
        $this -> Cars = array();
    }
    protected function IsStreetLegal($car)
    {
        if ($car->getMaxSpeend() < $this -> SpeendLimit)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public function AddCar($car)
    {
        if($this->IsStreetLegal($car))
        {
            echo 'The Car was allowed on the road.';
            $this->Cars[] = $car;
        }
        else
        {
            echo 'The Car is too fast and was not allowed on the road.';
        }
    }
}
$Porsche911 = new Roadster();
$Porsche911->SetSpeend(340);
$FuWaiStreet = new Street(80);
$FuWaiStreet->AddCar($Porsche911);
/**
 *
 * @result
 *
 * The Car is too fast and was not allowed on the road.[Finished in 0.1s]
 *
 */
?>

2.对象接口

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。

接口中定义的所有方法都必须是公有,这是接口的特性。

接口是一种类似于类的结构,可用于声明实现类所必须声明的方法。例如,接口通常用来声明API,而不用定义如何实现这个API。

大多数开发人员选择在接口名称前加上大写字母I作为前缀,以便在代码和生成的文档中将其与类区别开来。

2.1接口实现(implements)

要实现一个接口,使用 implements 操作符(继承抽象类需要使用 extends 关键字不同),类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。

实现多个接口时,接口中的方法不能有重名。
接口也可以继承,通过使用 extends 操作符。
类要实现接口,必须使用和接口中所定义的方法完全一致的方式。否则会导致致命错误。
接口中也可以定义常量。接口常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。
2.2使用接口的案例

代码如下:

<?php
abstract class Car
{   
    abstract function SetSpeend($speend = 0);
}
interface ISpeendInfo
{
    function GetMaxSpeend();
}
class Roadster extends Car implements ISpeendInfo
{
    public $Speend;
    public function SetSpeend($speend = 0)
    {
        $this->Speend = $speend;
    }
    public function getMaxSpeend()
    {
        return $this->Speend;
    }
}
class Street
{
    public $Cars ;
    public $SpeendLimit ;
    function __construct( $speendLimit = 200)
    {
        $this -> SpeendLimit = $speendLimit;
        $this -> Cars = array();
    }
    protected function IsStreetLegal($car)
    {
        if ($car->getMaxSpeend() < $this -> SpeendLimit)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public function AddCar($car)
    {
        if($this->IsStreetLegal($car))
        {
            echo 'The Car was allowed on the road.';
            $this->Cars[] = $car;
        }
        else
        {
            echo 'The Car is too fast and was not allowed on the road.';
        }
    }
}

$Porsche911 = new Roadster();
$Porsche911->SetSpeend(340);
$FuWaiStreet = new Street(80);
$FuWaiStreet->AddCar($Porsche911);
/**
 *
 * @result
 *
 * The Car is too fast and was not allowed on the road.[Finished in 0.1s]
 *
 */
?>

3、类型运算符 instanceof

instanceof 运算符是 PHP5 中的一个比较操作符。他接受左右两边的参数,并返回一个boolean值。

确定一个 PHP 变量是否属于某个一类 CLASS 的实例
检查对象是不是从某个类型继承
检查对象是否属于某个类的实例
确定一个变量是不是实现了某个接口的对象的实例

代码如下:

echo $Porsche911 instanceof Car;
//result:1

echo $Porsche911 instanceof ISpeendInfo;
//result:1

4.契约式编程

契约式设计或者Design by Contract (DbC)是一种设计计算机软件的方法。这种方法要求软件设计者为软件组件定义正式的,精确的并且可验证的接口,这样,为传统的抽象数据类型又增加了先验条件、后验条件和不变式。这种方法的名字里用到的“契约”或者说“契约”是一种比喻,因为它和商业契约的情况有点类似。

在编写类之前实现声明接口的一种编程实践。这种方法在保证类的封装性方面非常有用。使用契约式编程技术,我们可以在创建应用程序之前定义出视图实现的功能,这和建筑师在修建大楼之前先画好蓝图的做法非常相似。

5.总结

抽象类是使用 abstract 关键字声明的类。通过将某个类标记为抽象类,我们可以推迟实现所声明的方法。要将某个方法声明为抽象方法,只要去掉包含所有大括号的方法实体,将方法声明的代码行用分号结束即可。

抽象类不能直接实例化,他们必须被继承。

如果某个类从抽象类继承,当它没有实现基类中所声明的所有抽象方法时,它就必须也被声明为抽象的。

在接口中,我们可以声明没有方法体的方法原型,这点与抽象类很相似。他们之间的区别在于,接口不能声明任何具有方法体的方法;并且他们使用的语法也不一样。为了将揭开规则强制加到某个类上,我们需要使用implements关键字,而不是extends关键字。

有些情况下我们需要确定某个类是否是特定类的类型,或者是否实现了特定的接口。 instanceof 分成适合完成这个任务。instanceof 检查三件事情:实例是否是某个特定的类型,实例是否从某个特定的类型继承,实例或者他的任何祖先类是否实现类特定的接口。

某些语言具有从多个类继承的能力,这称为多重继承。PHP不支持多重继承。想法,他提供了为一个类声明多个接口的功能。

接口在声明类必须遵循的规则时非常有用。契约式编程技术使用这一功能来增强封装性,优化工作流。

(0)

相关推荐

  • PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)

    本文实例讲述了PHP面向对象的特性.分享给大家供大家参考,具体如下: Demo1.php <?php header('Content-Type:text/html; charset=utf-8;'); //创建一个电脑类 class Computer { //什么叫做类内,就是创建类的花括号内的范围叫做类内,其他地方则类外. //public 是对字段的公有化,这个字段类外即可访问,赋值和取值 public $_name = '联想'; } $computer = new Computer();

  • php面向对象全攻略 (七) 继承性

    11.类的继承 继承作为面向对象的三个重要特性的一个方面,在面向对象的领域有着极其重要的作用, 好像没听说哪个面向对象的语言不支持继承.继承是PHP5 面向对象程序设计的重要特性之 一,它是指建立一个新的派生类,从一个或多个先前定义的类中继承数据和函数,而且可以 重新定义或加进新数据和函数,从而建立了类的层次或等级.说的简单点就是,继承性是子 类自动共享父类的数据结构和方法的机制,这是类之间的一种关系.在定义和实现一个类的 时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的

  • PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)

    面象对向的三大特点:封装性.继承性.多态性 首先简单理解一下抽象:我们在前面定义一个类的时候,实际上就是把一类事物共有的属性和行为提取出来,形成一个物理模型(模版),这种研究问题的方法称为抽象一.封装性 封装就是把抽取出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有被授权的操作(方法)才能对数据进行操作. php提供了三种访问控制修饰符 public 表示全局,本类内部,类外部,子类都可以访问 protected 表示受保护的,只有本类或子类可以访问 private 表示

  • PHP面向对象继承用法详解(优化与减少代码重复)

    本文实例讲述了PHP面向对象继承用法.分享给大家供大家参考,具体如下: 继承 先看两个类 <?php class CdProduct { public $playLength; // 播放时间 public $title; public $producerMainName; public $producerFirstName; public $price; function __construct( $title, $firstName, $mainName, $price, $playLeng

  • PHP面向对象程序设计之接口用法

    接口是PHP面向对象程序设计中非常重要的一个概念.本文以实例形式较为详细的讲述了PHP接口的用法.具体如下: 接口:interface 在PHP中,我们可以规定,一个对象应该具有哪些公共的外部操作,即可使用interface来规定. 公共的方法就是接口.用于规定一个对象应该用于哪些公共的操作方法(接口),这个也叫接口(公共操作方法的集合) 即:接口(interface结构,公共方法集合) 公共方法(接口方法) 定义:用于限定某个对象所必须拥有的公共操作方法的一种结构,称之为接口(interfac

  • PHP接口继承及接口多继承原理与实现方法详解

    本文实例讲述了PHP接口继承及接口多继承原理与实现方法.分享给大家供大家参考,具体如下: 在PHP的接口中,接口可以继承接口.虽然PHP类只能继承一个父类(单继承),但是接口和类不同,接口可以实现多继承,可以继承一个或者多个接口.当然接口的继承也是使用extends关键字,要多个继承的话只要用逗号把继承的接口隔开即可. 需要注意的是当你接口继承其它接口时候,直接继承父接口的静态常量属性和抽象方法,所以类实现接口时必须实现所有相关的抽象方法. 现在你对PHP接口的继承有所了解了吧,下面的例子可供参

  • php学习笔记 面向对象中[接口]与[多态性]的应用

    复制代码 代码如下: <?php /* 接口技术 * * 接口是一种特殊的抽象类,抽象类又是一种特殊的类 * * 接口和抽象类是一样的作用 * * 因为在PHP是单继承的,如果使用抽象类,子类实现抽象类就不能再去继承其他的类了 * * 如果既想实现一些规范,又想继承其他类.就要使用接口. * * 接口和抽象类的对比 * * 1.作用相同,都不能创建对象,都需要子类去实现 * * 2.接口的声明和抽象类不一样 * * 3.接口被实现方式不一样 * * 4.接口中的所有方法必须是抽象方法,只能声明抽

  • PHP面向对象程序设计OOP继承用法入门示例

    本文实例讲述了PHP面向对象程序设计OOP继承用法.分享给大家供大家参考,具体如下: <?php class Person { var $name;//protected var $sex; var $age; function __construct($name = "", $sex = "男", $age = 22) { $this->name = $name; $this->sex = $sex; $this->age = $age;

  • PHP面向对象的进阶学习(抽像类、接口、final、类常量)

    一.抽像类(abstract) 在我们实际开发过程中,有些类并不需要被实例化,如前面学习到的一些父类,主要是让子类来继承,这样可以提高代码复用性 语法结构: 复制代码 代码如下: abstract class 类名{ 属性 $name; 方法(){} //方法也可以为abstract 修饰符 function 方法名(){} } 例: 复制代码 代码如下: abstract class animal{ public $name; public $age; //抽象方法不能有方法体,主要是为了让子

  • php面向对象全攻略 (十四) php5接口技术

    20.PHP5 接口技术 PHP 与大多数面向对象编程语言一样,不支持多重继承.也就是说每个类只能继承一个父 类.为了解决这个问题,PHP 引入了接口,接口的思想是指定了一个实现了该接口的类必须 实现的一系列方法.接口是一种特殊的抽象类,抽象类又是一种特殊的类,所以接口也是一 种特殊的类,为什么说接口是一种特殊的抽象类呢?如果一个抽象类里面的所有的方法都是 抽象方法,那么我们就换一种声明方法使用"接口":也就是说接口里面所有的方法必须都是 声明为抽象方法,另外接口里面不能声明变量,而且

  • PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)

    本文实例讲述了PHP面向对象程序设计高级特性.分享给大家供大家参考,具体如下: 静态属性 <?php class StaticExample { static public $aNum = 0; // 静态共有属性 static public function sayHello() { // 静态共有方法 print "hello"; } } print StaticExample::$aNum; StaticExample::sayHello(); ?> 输出:0   

随机推荐