dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>PHP>php技术资料>文章内容
高级PHP V5 对象研究
来源:未知     作者:    
 

高级 V5 对象研究
本文介绍了 V5一些更高级的面向设计的特性。其中包括各种对象类型,它们允许将系统中的组件相互分离,创建可重用、可扩展、可伸缩的代码。


  领会暗示 

  首先介绍一下对象类型和类型提示的优点。一个类定义一种类型。从该类实例化的任何对象属于该类定义的类型。所以,使用 Car 类创建 Car 对象。如果 Car 类继承 Vehicle 超类,则 Car 对象还将是一个 Vehicle 对象。这反映了我们在现实世界中分类事物的方法。但正如您将看到的,类型不仅仅是分类系统元素的有用方法。类型是编程的基础,因为类型是良好一致的行为的保证。许多设计技巧来自该保证。

  “开始了解 PHP V5 中的对象”展示对象为您保证了接口。当系统传递 Dictionary 对象时,您可以确定它具有 $translations 数组和 summarize() 方法。相反,关联数组不提供相同级别的确定性。要利用类提供的清晰,需要知道您的对象实际上是 Dictionary 的一个实例,而不是某个 imposter。可以用 instanceof 操作符来手动验证这一点,该操作符是  V5 引入的介于对象实例和类名之间的一个便捷工具。

   instanceof Dictionary

  如果给定对象是给定类的实例,则 instanceof 操作符解析为真。在调用方法中第一次遇到 Dictionary 对象时,可以在使用它之前检查它的类型。

if ( $en instanceof Dictionary ) {
 print $en->summarize();
}

  但是,如果使用  V5 的话,可以将对象类型检查构建到类或方法声明中。

  在“开始了解  V5 中的对象”中,重点介绍两个类:Dictionary,它存储术语和翻译, DictionaryIO,它将 Dictionary 数据导出(导入)自(至)文件系统。这些特性使得将 Dictionary 文件发送到第三方翻译器变得容易,第三方翻译器可以使用自己的软件来编辑数据。然后,您可以重新导入已处理的文件。清单 1 是 Dictionary 类的一个版本,它接受一个 DictionaryIO 对象,并将其存储以备将来使用。

  清单 1. 接受 DictionaryIO 对象的 Dictionary 类的一个版本

class Dictionary {
 public $translations = array();
 public $type ="En";
 public $dictio;

 function addDictionaryIO( $dictio ) {
  $this->dictio=$dictio;
 }

 function export() {
  if ( $this->dictio ) {
   $this->dictio->export( $this );
  }
 }
}

class DictionaryIO {
 function export( $dict ) {
  print "exporting dictionary data "."($dict->type)\n";
 }
}

$en = new Dictionary();
$en->addDictionaryIO( new DictionaryIO() );
$en->export();

// output: 
// dumping dictionary data (En)

  DictionaryIO 类具有单个方法 export(),它接受一个 Dictionary 对象,并使用它来输出假消息。现在,Dictionary 具有两个新方法:addDictionaryIO(),接受并存储 DictionaryIO 对象; export(),使用已提供的对象导出 Dictionary 数据 —— 或者是在完全实现的版本中。

  您可能会疑惑为什么 Dictionary 对象不仅实例化自己的 DictionaryIO 对象,或者甚至在内部处理导入导出操作,而根本不求助于第二个对象。一个原因是您可能希望一个 DictionaryIO 对象使用多个 Dictionary 对象,或者希望存储该对象的单独引用。另一个原因是通过将 DictionaryIO 对象传递给 Dictionary,可以利用类切换或 多态性。换句话说,可以将 DictionaryIO 子类(比如 DictionaryIO)的实例传递给 Dictionary,并更改运行时保存和检索数据的方法。

  图 1 显示了 Dictionary 和 DictionaryIO 类及其使用关系。

正如所显示的,没有什么阻止编码器将完全随机的对象传递给 addDictionaryIO()。只有在运行 export() 时,才会获得一个类似的错误,并发现已经存储在 $dictio 中的对象实际上并没有 export() 方法。使用 PHP V4 时,必须测试本例中的参数类型,以绝对确保编码器传递类型正确的对象。使用 V5 时,可以部署参数提示来强制对象类型。只将所需的对象类型添加到方法声明的参数变量中,如清单 2 所示:

  清单 2. 将对象类型添加到方法声明的参数变量中

function addDictionaryIO( DictionaryIO $dictio ) {
 $this->dictio=$dictio;
}

function export() {
 if ( $this->dictio ) {
  $this->dictio->export( $this );
 }
}

  现在,如果客户机编码器试图将类型错误的对象传递给 addDictionaryIO(), 引擎将抛出一个致命错误。因此,类型提示使得代码更安全。不幸的是,提示仅对对象有效,所以不能在参数列表中要求字符串或整数。必须手动测试这些原类型。

  即使可以保证 addDictionaryIO() 将获得正确的对象类型,但不能保证该方法被首先调用。export() 方法测试 export() 方法中 $dictio 的存在,从而避免错误。但您可能希望更严格一些,要求 DictionaryIO 对象传递给构造,从而确保 $dictio 总是被填充。

  调用覆盖方法

  在清单 3 中,XmlDictionaryIO 集成 DictionaryIO。而 DictionaryIO 写入并读取序列化数据,XmlDictionaryIO 操作 XML,可以与第三方应用程序共享。XmlDictionaryIO 可以覆盖其父方法(import() 和 export()),也可以选择不提供自己的实现(path())。如果客户机调用 DictionaryIO 对象中的 path() 方法,则在 DictionaryIO 中实现的 path() 方法被调用。

  事实上,可以同时使用这两种方法。可以覆盖方法并调用父实现。为此,使用新关键字 parent。用范围解析操作符和所讨论方法的名称来使用 parent 。例如,假设需要 XmlDictionaryIO 使用当前工作目录(如果有一个可用)中叫做 的目录;否则,它应使用由父 DictionaryIO 类生成的默认路径,如清单 3 所示:

  清单 3. XmlDictionaryIO 使用 目录或由 DictionaryIO 类生成的默认路径

class DictionaryIO extends DictionaryIO {

 function path( Dictionary $dictionary, $ext ) {
  $sep = DIRECTORY_SEPARATOR;
  if ( is_dir( ".{$sep}" ) ) {
   return ".{$sep}{$sep}{$dictionary->getType()}.$ext";
  }
  return parent::path( $dictionary, $ext );
 }
// ...

  可以看到,该方法检查本地 目录。如果该测试失败,则它使用 parent 关键字指派给父方法。

[1]   

 

 

上一篇:PHP生成动态WAP页面   下一篇:PHP中for循环语句的几种变型
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·通过对PHP服务器端特性的配置加
·php与mysql三日通
·AJAX技术在PHP开发中的简单应用
·大家所使用的PHP开发环境
·PHP缓存的实现
·针对PHP新手总结的PHP基础知识
·一个简单实现多条件查询的例子
·PHP串行化变量和序列化对象
·PHP表单
·推荐阅读:php技术生成静态页面
·php实用函数
·php生成随机数
  相关文章
·PHP生成动态WAP页面
·PHP中for循环语句的几种变型
·PHP VS ASP
·PHP中for循环语句的几种“变态”
·PHP中的加密功能
·PHP5.0对象模型探索之对象串行化
·实例学习PHP之投票程序篇
·PHP5.0对象模型探索之重载
·PHP编程常用技巧四则
·php通用检测函数集(5)
·在PHP中以root身份运行外部命令
·使用php通过smtp发送邮件新手指
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763