PHP契约式编程
2014-05-16 09:46
260 查看
先复习一下面向对象编程中的两个重要元素:抽象类和接口
抽象类
当类中有一个方法为抽象方法,该类就应该定义为抽象类
继承一个抽象类,应该实现其所有抽象方法
例:
接口
接口定义了一系列必要的操作,实现接口的类必须实现接口的方法
例:
契约式编程
使用抽象类和接口实现契约式编程,这样编程可以使结构更清晰,扩展性高;
特别适用于团队开发项目框架编写,比如可以通过定义一个数据库操作模型module,使所有需要操作数据库的module派生类都必须实现模型中的方法,这样就实现了数据层与控制层的分离,编写控制层只需要有数据层的文档即可知道基本操作;
如何使用抽象类?
抽象类定义基本方法,而具体的功能实现交给具体实现的类,当需要更换操作是,只需要重写抽象类中的基本方法
如何使用接口?
接口是用来约束一个类型,实现面向对象编程的多态性,我们定义了一个类型,而这个类型回派生很多类型,但是这些类型都需要有基类型的这些操作
例:
image.class.php
<?php
//定义一个图像接口
interface image{
//创建图像
public function getImage();
}
baseImage.class.php
<?php
include_once 'fileNotFoundException.class.php';
include_once 'image.class.php';
abstract class baseImage implements image{
protected $path; //图片路径
protected $info; //信息数组
public function __construct($path){
$this->path=$path;
if(!file_exists($this->path)){
throw new fileNotFoundException("文件 ".$path." 不存在" );
}
}
//生成信息
protected function createInfo(){
$this->info['size']= filesize ( $this->path );
$this->info['type']= filetype ( $this->path );
}
public function __get($k){
if($k=='info'){
$this->createInfo();
}
return $this->$k;
}
}
jpgImage.class.php
<?php
include_once 'image.class.php';
include_once 'baseImage.class.php';
class jpgImage extends baseImage implements image{
public function getImage(){
echo '创建一个 jpg 类型的图片';
}
}
抽象类
当类中有一个方法为抽象方法,该类就应该定义为抽象类
继承一个抽象类,应该实现其所有抽象方法
例:
<?php abstract class car{ protected $name; protected $speed; public function __construct($name, $speed){ $this->name=$name; $this->speed=$speed; } abstract function run(); public function __get($k){ if(in_array($k, array('name'))){ //如果访问的属性是不允许的,抛出error级别错误 trigger_error ( "禁止访问私有成员 : ".$k , E_USER_ERROR ) ; return ; } return $this->$k; } }
接口
接口定义了一系列必要的操作,实现接口的类必须实现接口的方法
例:
people.interface.php <?php interface people{ //定义say方法,时所有派生类必须实现 public function say(); } work.class.php <?php include 'people.interface.php'; class worker implements people{ private $name; private $age; public function __construct($name, $age){ $this->name=$name; $this->age=$age; } //实现接口定义方法 public function say(){ echo $this->name.', age is '.$age.' <br />'; } public function __get($k){ if($k=='name'){ //如果访问的属性是不允许的,抛出error级别错误 trigger_error ( "禁止访问私有成员 : ".$k , E_USER_ERROR ) ; return; } return $this->$k; } }
契约式编程
使用抽象类和接口实现契约式编程,这样编程可以使结构更清晰,扩展性高;
特别适用于团队开发项目框架编写,比如可以通过定义一个数据库操作模型module,使所有需要操作数据库的module派生类都必须实现模型中的方法,这样就实现了数据层与控制层的分离,编写控制层只需要有数据层的文档即可知道基本操作;
如何使用抽象类?
抽象类定义基本方法,而具体的功能实现交给具体实现的类,当需要更换操作是,只需要重写抽象类中的基本方法
如何使用接口?
接口是用来约束一个类型,实现面向对象编程的多态性,我们定义了一个类型,而这个类型回派生很多类型,但是这些类型都需要有基类型的这些操作
例:
image.class.php
<?php
//定义一个图像接口
interface image{
//创建图像
public function getImage();
}
baseImage.class.php
<?php
include_once 'fileNotFoundException.class.php';
include_once 'image.class.php';
abstract class baseImage implements image{
protected $path; //图片路径
protected $info; //信息数组
public function __construct($path){
$this->path=$path;
if(!file_exists($this->path)){
throw new fileNotFoundException("文件 ".$path." 不存在" );
}
}
//生成信息
protected function createInfo(){
$this->info['size']= filesize ( $this->path );
$this->info['type']= filetype ( $this->path );
}
public function __get($k){
if($k=='info'){
$this->createInfo();
}
return $this->$k;
}
}
jpgImage.class.php
<?php
include_once 'image.class.php';
include_once 'baseImage.class.php';
class jpgImage extends baseImage implements image{
public function getImage(){
echo '创建一个 jpg 类型的图片';
}
}
相关文章推荐
- PHP 面向对象编程和设计模式 (1/5) - 抽象类、对象接口、instanceof 和契约式编程
- PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
- php 抽象类、接口、契约式编程
- PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
- PHP OPP机制和模式简介(抽象类、接口和契约式编程)
- PHP OPP机制和模式简介(抽象类、接口和契约式编程)
- [ZT]用PHP与XML联手进行网站编程
- (转贴)Linux下的编程 PHP高级技巧全放送(一)
- 最近碰到个问题,关于php扩展编程如何返回数组的问题
- [转贴] PHP 编程标准
- 用PHP编程开发“虚拟域名”系统
- 契约式编程
- PHP编程:探索字串的奥秘
- 爱生活,爱编程——纪念PHP编码两万行
- php 安全编程
- 理解PHP中的MVC编程之MVC框架简介
- 利用 gettext 来实现 PHP 的国际化编程
- Zend PHP 5 编程大赛冠军归 Qiang Xue
- 利用 gettext 来实现 PHP 的国际化编程
- PHP套接字编程(socket)