唐山网站建设

设为主页 加入收藏 繁體中文

PHP 5.0中多态性的实现方案浅析

核心提示:PHP的最新发行版本中已实现了对迟绑定的支持。固然,在使用其迟绑定功能时还存在很多题目。假设你使用的是更旧版本的PHP(我的服务器上运行的是PHP 5.0.1版本),那末你可能发现其中缺少对迟绑定的支持。因此,请留意本文中的代码有可能没法工作在你特定的PHP 5版本

  提要:本文将讨论多态性的概念及其在面向对象设计中的利用,还将分析如何在PHP 5中使用多态性和存在的优缺点。

  PHP的最新发行版本中已实现了对迟绑定的支持。固然,在使用其迟绑定功能时还存在很多题目。假设你使用的是更旧版本的PHP(我的服务器上运行的是PHP 5.0.1版本),那末你可能发现其中缺少对迟绑定的支持。因此,请留意本文中的代码有可能没法工作在你特定的PHP 5版本中。

  1、 PHP 5和多态性

  本文想讨论面向对象编程中最为重要的部份之1--多态性的设计。为了说明题目,我使用了PHP 5。在你继续浏览之前,请首先明确本文其实不是完全有关于PHP的。虽然这类语言在之前的两个主要版本中在快速开发方面已取得很大的进步,但是,在其与更加成熟的语言如C++或Java相匹敌之前,它对对象的支持还要经历1段历程。

  假设你是1位面向对象编程的进门者,那末本文可能不合适你,由于多态性这部份知识比较特别:1旦理解了它,你将永久不会忘记。假设你想简单了解1点对象编程和设计知识,并且当某人说"某个对象是多态的"时,还不10分清楚这是甚么意思的话,那末本文正合适你。
到本文最后,你应当知道甚么是多态性和如何把它利用到面向对象的设计中,并且你会了解PHP 5中对象编程的优点与不足。

  2、甚么是多态性?

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

  假设你熟习设计模式,即使只是有个初步了解,那末你也会了解这个概念。事实上,多态性多是基于模式设计编程中的最伟大的工具。它答应我们以1种逻辑的方式来组织相类似的对象从而实现在具体编码时没必要担心对象的具体类型;而且,我们只需要对1个所期看的接口或基类编程即可。1个利用程序越抽象,则它就显得越灵活--而多态性是对行动加以抽象的最好的方式之1。

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

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

  3、利用多态性设计

  我们将继续使用Person基类的例子,现在让我们分析1个非多态性的实现。以下示例中使用了不同类型的Person对象--这是1种非常不理想的编程方式。留意,实际的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!');
 }
?>

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

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

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

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

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

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

  在此,David类中的AddFeedback方法实现中首先调用了Person::AddFeedback方法。你可能留意到,它模仿了C++,Java或C#中的方法重载。请记住,这仅是1个简单化的示例,并且你编写的实际代码完全依托于你的实际工程。

1 2 下1页

核心提示:PHP的最新发行版本中已实现了对迟绑定的支持。固然,在使用其迟绑定功能时还存在很多题目。假设你使用的是更旧版本的PHP(我的服务器上运行的是PHP 5.0.1版本),那末你可能发现其中缺少对迟绑定的支持。因此,请留意本文中的代码有可能没法工作在你特定的PHP 5版本

  4、PHP 5中的迟绑定

  依我的看法,迟绑定正是使得Java和C#如此引人注视的重要缘由。它们答应基类方法用"this"或$this来调用方法(即使它们不存在于基类中或调用1个基类中的方法,它有可能为继续类中的另1个版本所代替)。你可以以为以下的实现在PHP中是答应的:

<?php
class Person{
 function AddFeedback($messageArray) {
  $this->ParseFeedback($messageArray);
  //写向数据库
 }
}
class David extends Person{
 function ParseFeedback($messageArray){
  // 进行1些分析
 }
}
?>

  记住,在Person类中并没有ParseFeedback。现在,假定你具有这1部份实现代码(为了本例说明题目起见),那末这会导致$myPerson成为1个David对象:

<?php
$myPerson = Person::GetPerson($name);
$myPerson->AddFeedback($messageArray);
?>

  出现分析毛病!大致毛病信息为,方法ParseFeedback其实不存在或1些类似的信息。关于PHP 5中的迟绑定我们就讨论这些!下面我们再回纳1下迟绑定的概念。

  迟绑定意味着,方法调用在最后时刻才绑定到目标对象。这意味着,当该方法被运行时刻调用时,那些对象已有了1种具体类型。在我们上面的示例中,你调用了David::AddFeedback(),而既然David::AddFeedback()中的$this援用1个David对象,那末你可以逻辑地假定ParseFeedback()方法是存在的--但事实上它其实不存在,由于AddFeedback()是在Person中定义的,并且从Person类中调用ParseFeedback()。
不幸的是,没有简单的方法来消除PHP 5中的这类行动。这意味着,当你想创建1个灵活的多态类层次时你可能有点无能为力。

  我必须指出,我选择PHP 5作为本文的表达语言仅仅是由于:这类语言并没有实现对象概念的完善抽象!由于PHP 5还处于其测试版本运行期,所以这是可以体谅的。另外,既然该语言中加进了抽象类和接口,迟绑定也应当被实现。

  5、小结

  至此,你应当基本了解甚么是多态性和为甚么PHP 5在实现多态性方面其实不完善。1般说来,你应当知道如何用1个多态性对象模型来封装有条件的行动。固然,这样会进步你的对象的灵活性,并且意味着更少的代码实现。另外,通过封装满足1定条件的行动(具体要依托于对象的状态),你还进步了代码的清楚程度。

上1页 1 2 http://www.fw8.net/


TAG:方法,代码,对象,多态性,绑定
评论加载中...
内容:
评论者: 验证码: