2005 年 9 月 08 日
2005 年 5 月,IBM developerWorks 文章“开始了解 PHP V5 中的对象”介绍了足够的详细信息来让读者理解 PHP 中类和对象的基本原理。本文介绍了 PHP V5 一些更高级的面向设计的特性。其中包括各种对象类型,它们允许将系统中的组件相互分离,创建可重用、可扩展、可伸缩的代码。
领会暗示
首先介绍一下对象类型和类型提示的优点。一个类定义一种类型。从该类实例化的任何对象属于该类定义的类型。所以,使用 Car 类创建 Car 对象。如果 Car 类继承 Vehicle 超类,则 Car 对象还将是一个 Vehicle 对象。这反映了我们在现实世界中分类事物的方法。但正如您将看到的,类型不仅仅是分类系统元素的有用方法。类型是面向对象编程的基础,因为类型是良好一致的行为的保证。许多设计技巧来自该保证。
“开始了解 PHP V5 中的对象”展示对象为您保证了接口。当系统传递 Dictionary 对象时,您可以确定它具有 $translations 数组和 summarize() 方法。相反,关联数组不提供相同级别的确定性。要利用类提供的清晰接口,需要知道您的对象实际上是 Dictionary 的一个实例,而不是某个 imposter。可以用 instanceof 操作符来手动验证这一点,该操作符是 PHP V5 引入的介于对象实例和类名之间的一个便捷工具。
$en instanceof Dictionary
|
如果给定对象是给定类的实例,则 instanceof 操作符解析为真。在调用方法中第一次遇到 Dictionary 对象时,可以在使用它之前检查它的类型。
if ( $en instanceof Dictionary ) {
print $en->summarize();
}
|
但是,如果使用 PHP V5 的话,可以将对象类型检查构建到类或方法声明中。
在“开始了解 PHP 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 子类(比如 XmlDictionaryIO)的实例传递给 Dictionary,并更改运行时保存和检索数据的方法。
图 1 显示了 Dictionary 和 DictionaryIO 类及其使用关系。
图1. Dictionary 和 DictionaryIO 类
正如所显示的,没有什么阻止编码器将完全随机的对象传递给 addDictionaryIO()。只有在运行 export() 时,才会获得一个类似的错误,并发现已经存储在 $dictio 中的对象实际上并没有 export() 方法。使用 PHP V4 时,必须测试本例中的参数类型,以绝对确保编码器传递类型正确的对象。使用 PHP V5 时,可以部署参数提示来强制对象类型。只将所需的对象类型添加到方法声明的参数变量中,如清单 2 所示:
清单2. 将对象类型添加到方法声明的参数变量中
function addDictionaryIO( DictionaryIO $dictio ) {
$this->dictio=$dictio;
}
function export() {
if ( $this->dictio ) {
$this->dictio->export( $this );
}
}
|
现在,如果客户机编码器试图将类型错误的对象传递给 addDictionaryIO(),PHP 引擎将抛出一个致命错误。因此,类型提示使得代码更安全。不幸的是,提示仅对对象有效,所以不能在参数列表中要求字符串或整数。必须手动测试这些原类型。
即使可以保证 addDictionaryIO() 将获得正确的对象类型,但不能保证该方法被首先调用。export() 方法测试 export() 方法中 $dictio 属性的存在,从而避免错误。但您可能希望更严格一些,要求 DictionaryIO 对象传递给构造函数,从而确保 $dictio 总是被填充。
调用覆盖方法
在清单 3 中,XmlDictionaryIO 集成 DictionaryIO。而 DictionaryIO 写入并读取序列化数据,XmlDictionaryIO 操作 XML,可以与第三方应用程序共享。XmlDictionaryIO 可以覆盖其父方法(import() 和 export()),也可以选择不提供自己的实现(path())。如果客户机调用 XmlDictionaryIO 对象中的 path() 方法,则在 DictionaryIO 中实现的 path() 方法被调用。
事实上,可以同时使用这两种方法。可以覆盖方法并调用父实现。为此,使用新关键字 parent。用范围解析操作符和所讨论方法的名称来使用 parent 。例如,假设需要 XmlDictionaryIO 使用当前工作目录(如果有一个可用)中叫做 xml 的目录;否则,它应使用由父 DictionaryIO 类生成的默认路径,如清单 3 所示:
清单3. XmlDictionaryIO 使用 xml 目录或由 DictionaryIO 类生成的默认路径
class XmlDictionaryIO extends DictionaryIO {
function path( Dictionary $dictionary, $ext ) {
$sep = DIRECTORY_SEPARATOR;
if ( is_dir( ".{$sep}xml" ) ) {
return ".{$sep}xml{$sep}{$dictionary->getType()}.$ext";
}
return parent::path( $dictionary, $ext );
}
// ...
|
可以看到,该方法检查本地 xml 目录。如果该测试失败,则它使用 parent 关键字指派给父方法。
子类和构造函数方法
parent 关键字在构造函数方法中尤其重要。如果在子类中不定义构造函数,则 parent 构造函数代表您被显式调用。如果在子类中不创建构造函数方法。则调用父类的构造函数并传递任何参数是您的责任,如清单 4 所示:
Listing 4. Invoking the parent class's constructor
class SpecialDictionary extends Dictionary {
function __construct( $type,
DictionaryIO $dictio,
$additional ) {
// do something with $additional
parent::__construct( $type, $dictio );
}
}
|
抽象类和方法
虽然在父类中提供默认行为是完全合法的,但这可能不是最巧妙的方法。对于启动器,您必须依赖子类的作者来理解它们必须实现 import() 和 export(),才能在 broken 状态创建类。而且,DictionaryIO 类实际上是兄弟,而不是父子。XmlDictionaryIO 不是 DictionaryIO 的特例;相反,它是一种备选实现。
PHP V5 允许定义部分实现的类,其主要角色是为它的子女指定核心接口。这种类必须声明为抽象。
abstract class DictionaryIO {
}
|
抽象类不能实例化。必须创建子类(即,创建继承它的类),并创建该子类的实例。可以在抽象类中声明标准和抽象方法,如清单 5 所示。抽象方法必须用 abstract 关键字限定,且必须只由一个方法签名组成。这意味着,抽象方法应包括 abstract 关键字、可选的可见度修改符、function 关键字,以及圆括号内可选的参数列表。它们不应有任何方法主体。
<sp
分享到:
相关推荐
【标题】"cos-php-sdk-v5-master.zip" 指的是腾讯云对象存储服务(Cloud Object Storage,简称COS)的PHP SDK的第五个主要版本的源代码压缩包。这个SDK是专为PHP开发者设计的,允许他们方便地在自己的应用中集成腾讯...
### CATIA_V5_初级到高级进阶篇 #### 一、重要说明 《CATIA V5 机械设计从入门到精通(进阶篇)》是中国青年出版社出版的一本关于CATIA V5软件的进阶教程。这本书属于CAD/CAE/CAM系列丛书的一部分,旨在帮助读者从...
总之,PHP V5 的新特性极大地增强了其作为面向对象语言的能力,为大型项目提供了更强大的支持。通过逐步地、系统地迁移现有代码,开发者可以充分利用这些改进,提升代码质量和可维护性。在实际操作中,可能还需要...
在 Bdd100k 数据集上训练 yolo v5 对象检测模型YOLO V5s Bdd100k 训练我的项目需要以下文件模型/custom_yolov5s.yaml模型/uc_data.yaml数据/bdd100k.名称权重/yolov5s.ptyolov5s_training_bdd100k.ipynbbdd_预处理....
CATIA V5 Automation 教程 CATIA V5 Automation 是一款强大的三维计算机辅助设计(CAD)软件,旨在帮助用户自动化设计、仿真和分析过程。本教程旨在指导用户如何使用 CATIA V5 Automation 的功能,特别是在知识专家...
【PHP v5 学习(CHM).rar】这个压缩包文件包含了关于PHP 5的深入学习资源,旨在帮助初学者和有一定经验的开发者提升在PHP 5环境下的动态网站开发技能。CHM(Compiled Help Manual)文件是一种常见的帮助文档格式,...
《华为2288H V5/2288C V5/5288 V5 iBMC固件升级至V6.27详解》 在IT领域,服务器的管理是运维工作的重要组成部分,而华为2288H V5、2288C V5以及5288 V5作为企业级服务器,其智能基板管理控制器(iBMC)的固件升级更是...
使用方法: 1、下载主题源码 ripro-v5.zip 进行安装。 2、下载激活文件 ripro-v5-active.php 上传到wp根目录,访问一次,即可激活。
标题中的“华为光猫 HS8546v5升级固件,V5R19C20S125”指的是华为HS8546V5型号的光纤调制解调器(通常被称为光猫)的固件更新版本。这个固件版本号“V5R19C20S125”是华为设备软件的一个具体版本标识,它可能代表了...
江湖家居V5是一款专为家居装饰装修行业设计的PHP门户系统,它集成了多项功能,旨在为用户提供一个全面、高效且易用的在线平台。这款系统不仅适用于家居行业的商家展示产品和服务,还方便消费者进行信息查询、设计...
C++作为一款静态类型、编译型的面向对象编程语言,以其高效、稳定和强大的库支持而备受青睐。在Simurosot-5v5-SCU中,C++的特性如封装、继承和多态性为游戏逻辑的实现提供了良好的结构,同时,其底层优化能力确保了...
941n v5所有固件 (出厂设置)941 V5 ubnt编程器固件 刷机 救砖 中继设置 安装 LuCI web 界面,这样就可以在浏览器操作路由: opkg update opkg install luci /etc/init.d/uhttpd enable /etc/init.d/uhttpd start...
Keil的V5编译器安装包
这通常需要管理员权限,因此“V5使能”可能是指一种特定的命令或者配置步骤,用于解锁设备的高级功能。 Telnet则是一种远程登录协议,允许用户通过网络连接到ONT设备,进行远程管理。 获取超级密码是另一个关键点。...
qqlordbeta1_s60v5_build0007.sisx 中国移动飞信_S60V5.SISX 信安易卫士.sisx 墨迹天气_S60V5_5.2.sisx 天天动听 S60_v5_v3.71.SISx 扣费克星.s60v3.v5.signed.sisx 扣费克星_v3v5.sisx 来电通 S60 5th v2.8.2.0...
LAN主题是针对WordPress平台设计的一款高度可定制的主题,特别是Ripro-V5版本,它以其强大的功能和出色的用户体验而受到许多网站管理员的欢迎。Ripro-V5子主题LAN-V1.2则是对原主题的进一步扩展和优化,旨在提供更...
【标题】"v5多开器,沙盒,游戏多开"所指的是一款名为v5的多开工具,主要用于实现应用程序,特别是游戏的多个实例同时运行。在IT领域,多开器是一种软件,它允许用户在同一设备上开启同一程序的多个副本,这样就可以在...
这款工具由ARM公司提供,并且在V5版本中,针对ARM架构处理器提供了强大的支持。现在我们来详细探讨一下"keil 免费V5编译器安装包"所包含的知识点。 1. **Keil uVision IDE**: 这是一个集成开发环境,集成了编辑器、...
最新RiPro-V5主题V8.3开心版,已解除学习版+开心教程。RiPro主题全新V5版本,是一个优秀且功能强大、易于管理、现代化的WordPress虚拟资源...2、下载激活文件ripro-v5-active.php上传到wp根目录,访问一次,即可激活。
这种直观的界面和简洁的操作流程,极大地降低了数据采集的入门门槛,使得无论是初级用户还是高级开发者都能快速上手。 在技术层面,V5DataCollection基于.NET框架进行开发,利用了.NET丰富的类库和强大的性能,为...