PHP5中怎么实现多态性

一、 PHP 5和多态性

本文想讨论面向对象编程中最为重要的部分之一–多态性的设计。为了说明问题,我使用了PHP 5。在你继续阅读之前,请首先明确本文并不是完全有关于PHP的。尽管这种语言在以前的两个主要版本中在快速开发方面已经取得很大的进步,但是,在其与更为成熟的语言如C++或者Java相匹敌之前,它对于对象的支持还要经历一段历程。

如果你是一位面向对象编程的入门者,那么本文可能不适合你,因为PHP5多态性这部分知识比较特别:一旦理解了它,你将永远不会忘记。如果你想简单了解一点对象编程和设计知识,并且当某人说"某个对象是多态的"时,还不十分清楚这是什么意思的话,那么本文正适合你。

到本文***,你应该知道什么是多态性以及如何把它应用到面向对象的设计中,并且你会了解PHP 5中对象编程的优点与不足。

二、什么是多态性?

多态性,其来自于dictionary.com的定义是"以不同形式,阶段或者类型出现在独立的组织中或者同种组织中,而不存在根本区别。"由该定义,我们可以认为,多态性是一种通过多种状态或阶段来描述相同对象的编程方式。其实,它的真正意义在于:实际开发中,我们只需要关注一个接口或基类的编程,而不必担心一个对象所属于的具体类(class)。

如果你熟悉设计模式,即使只是有个初步了解,那么你也会了解这个概念。事实上,PHP5多态性可能是基于模式设计编程中的最伟大的工具。它允许我们以一种逻辑的方式来组织相类似的对象从而实现在具体编码时不必担心对象的具体类型;而且,我们只需要对一个所期望的接口或基类编程即可。一个应用程序越抽象,则它就显得越灵活–而多态性是对行为加以抽象的***的方式之一。

例如,让我们考虑一个叫Person的类。我们可以用称为David,Charles和Alejandro的类来子类化Person。Person有一个抽象方法AcceptFeedback(),所有的子类都要实现这个方法。这意味着,任何使用基类Person的子类的代码都能调用方法AcceptFeedback()。你不必检查该对象是一个David还是一个Alejandro,仅知道它是一个Person就够了。结果是,你的代码只需关注"最小公分母"-Person类即可。

在这个示例中的Person类也可以被创建为一个接口。当然,与上面相比存在一些区别,主要在于:一个接口并没有给出任何行为,而仅确定了一组规则。一个Person接口要求的是"你必须支持AddFeedback()方法",而一个Person类可以提供一些AddFeedback()方法的缺省代码-你对之的理解可以是"如果你不选择支持AddFeedback(),那么你应该提供一种缺省实现。"至于如何选择接口或基类则并非本文的主题;但是,一般说来,你需要通过基类来实现一个缺省的方法。如果你能够简单地勾勒出你的类所要实现的一组期望的功能,那么你也可以使用一个接口。

三、应用PHP5多态性设计

我们将继续使用Person基类的例子,现在让我们分析一个非多态性的实现。下列示例中使用了不同类型的Person对象–这是一种非常不理想的编程方式。注意,实际的Person类被省略。目前为止,我们仅关心代码调用的问题。

<?php    $name = $_SESSION['name'];    $myPerson = Person::GetPerson($name);    switch (get_class($myPerson)){   case 'David' :    $myPerson->AddFeedback('Great Article!','Some Reader', date('Y-m-d'));    break;   case 'Charles':    $myPerson->feedback[] = array('Some Reader', 'Great Editing!');    break;   case 'Alejandro' :    $myPerson->Feedback->Append('Awesome JavaScript!');    break;   default :    $myPerson->AddFeedback('Yay!');    }   ?>

这个示例展示了行为不同的对象,还有一个switch语句用于区分不同的Person类对象,从而执行其各自相应的正确操作。注意,这里针对不同条件的回馈注释是不同的。在实际应用程序开发中可能不会出现这种情形;我仅为了简单地说明类实现中存在的区别。

下面的一个示例使用了PHP5多态性。

<?php    $name = $_SESSION['name'];    $myPerson = Person::GetPerson($name);    $myPerson->AddFeedback('Great Article!', 'SomeReader', date('Y-m-d'));   ?>

注意,这里没有switch语句,而最重要的是,缺乏有关Person::GetPerson()会返回什么类型的对象。而另一个Person::AddFeedback()是一个多态方法。行为完全是由具体类进行封装的。请记住,在此无论我们使用的是David,Charles还是Alejandro,调用代码从不必了解具体类的功能,而仅知道基类就可以了。

尽管我的示例并不***,但是,从调用代码的角度,它已经展示了PHP5多态性的基本用法。现在我们需要分析这些类的内部实现。从一个基类进行派生的一个最伟大的地方在于,该派生类能够存取父类的行为,这种情况常常是缺省的实现,但是也可能出现在类继承链中用于创建更为复杂的行为。下面是这种情况的一个简单展示。

<?php   class Person{    function AddFeedback($comment, $sender, $date){   //把回馈添加到数据库    }   }   class David extends Person{    function AddFeedback($comment, $sender){   parent::AddFeedback($comment, $sender,   date('Y-m-d'));    }   }   ?>

原创文章,作者:DGSSA,如若转载,请注明出处:http://www.wangzhanshi.com/n/15185.html

(0)
DGSSA的头像DGSSA
上一篇 2025年1月2日 12:16:02
下一篇 2025年1月2日 12:16:04

相关推荐

  • PHP读取TXT文本内容的五种实用方法小结

    在Web开发中,我们经常需要读取和处理文本文件。PHP作为一种流行的服务器端脚本语言,提供了多种方法来读取TXT文本内容。本文将介绍五种不同的PHP教程,帮助您学习如何使用PHP读…

    php 2024年12月17日
  • php5与php7有什么区别

    php5与php7之间的区别: 1、性能提升:PHP7比PHP5.0性能提升了两倍。 2、以前的许多致命错误,现在改成抛出异常。 3、PHP 7.0比PHP5.0移除了一些老的不在…

    php 2025年1月1日
  • php5和php7的异常处理机制有区别吗

    1.php异常和错误 在其他语言中,异常和错误是有区别的,但是PHP,遇见自身错误时,会触发一个错误,而不是跑出异常。并且,php大部分情况,都会触发错误,终止程序执行,在php5…

    php 2025年1月1日
  • Laravel Homestead怎么支持PHP7

    如果你在使用PHP 5.x版的Homestead盒子,可以通过克隆laravel/homestead的php-7分支到一个新的文件夹来升级安装到PHP 7.0: git …

    php 2025年1月1日
  • PHP4和PHP5版本下如何解析XML文档

    XML文档 <?xml version="1.0" encoding="gbk"?> <Leapsou…

    php 2025年1月2日
  • PHP7中使用“DES-EDE-CBC”加解密的方法

    1. 条件约束 之前PHP5上常使用的mcrypt库在PHP7.1+上已经被移除,故我们采用openssl对数据进行加解密。 加密方式采用DES-EDE-CBC方式。 密钥填充方式…

    php 2025年1月1日
  • PHP8中的JIT是什么

    JIT 是一种编译器策略,它将代码表述为一种中间状态,在运行时将其转换为依赖于体系结构的机器码,并即时执行。在 PHP 中,这意味着 JIT 将为 Zend VM 生成的指令视为中…

    2025年1月2日
  • PHP 7.4如何使用箭头函数

    短闭包,也叫做箭头函数,是一种用 php 编写的短函数。当向函数中传递闭包时,这个功能是非常有用的,比如使用 array_map 或是 array_filter 函数时. 这就是它…

    php 2025年1月1日
  • php7与php5的区别有哪些

    php7和php5区别之间的区别: 1、性能提升:PHP7比PHP5.0性能提升了两倍。 2、全面一致的64位支持。 3、以前的许多致命错误,现在改成抛出异常。 4、PHP 7.0…

    php 2025年1月1日
  • php5不安全的原因是什么

    网络技术应用研究公司 W3Techs 近日表示,根据所有网站使用 PHP 版本的情况,从 2019 年 1 月 1 日起,有近 62% 的网站将会因为无法获得安全更新,而受到恶意攻…

    2025年1月2日

发表回复

登录后才能评论