仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1134|回复: 18
打印 上一主题 下一主题

[学习教程] PHP网站制作之PHP 5.0中多态性的完成计划

[复制链接]
海妖 该用户已被删除
跳转到指定楼层
#
发表于 2015-2-4 00:14:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我想在讲述自己的学习方式前,对那些期望能从我的文章中获得有用信息的人说一句心里话:    PHP的最新刊行版本中已完成了对迟绑定的撑持。固然,在利用其迟绑定功效时还存在良多成绩。假如你利用的是更旧版本的PHP(我的办事器上运转的是PHP 5.0.1版本),那末你能够发明个中缺少关于迟绑定的撑持。因而,请注重本文中的代码有能够没法任务在你特定的PHP 5版本中。   1、 PHP 5和多态性
  本文想会商面向对象编程中最为主要的局部之一--多态性的设计。为了申明成绩,我利用了PHP 5。在你持续浏览之前,请起首明白本文并非完整有关于PHP的。虽然这类言语在之前的两个次要版本中在疾速开辟方面已获得很大的前进,然而,在其与更加成熟的言语如C 或Java相匹敌之前,它关于对象的撑持还要履历一段过程。
  假如你是一名面向对象编程的入门者,那末本文能够不合适你,由于多态性这局部常识对照出格:一旦了解了它,你将永久不会健忘。假如你想复杂懂得一点对象编程和设计常识,而且当或人说"某个对象是多态的"时,还不非常清晰这是甚么意思的话,那末本文正合适你。
到本文最初,你应当晓得甚么是多态性和若何把它使用到面向对象的设计中,而且你会懂得PHP 5中对象编程的长处与缺乏。
  2、甚么是多态性?
  多态性,其来自于dictionary.com的界说是"以分歧模式,阶段或类型呈现在自力的组织中或同种组织中,而不存在基本区分。"由该界说,咱们可以以为,多态性是一种经由过程多种形态或阶段来描写不异对象的编程体例。其实,它的真正意义在于:实践开辟中,咱们只需求存眷一个接口或基类的编程,而不用忧虑一个对象所属于的详细类(class)。
  假如你熟习设计形式,即便只是有个初步懂得,那末你也会懂得这个概念。现实上,多态性多是基于形式设计编程中的最巨大的东西。它答应咱们以一种逻辑的体例来组织相相似的对象从而完成在详细编码时不用忧虑对象的详细类型;并且,咱们只需求对一个所希冀的接口或基类编程便可。一个使用法式越笼统,则它就显得越天真--而多态性是对行动加以笼统的最好的体例之一。
  例如,让咱们思索一个叫Person的类。咱们可以用称为David,Charles和Alejandro的类来子类化Person。Person有一个笼统办法AcceptFeedback(),一切的子类都要完成这个办法。这意味着,任何利用基类Person的子类的代码都能挪用办法AcceptFeedback()。你不用反省该对象是一个David仍是一个Alejandro,仅晓得它是一个Person就够了。了局是,你的代码只需存眷"最小公分母"-Person类便可。
  在这个示例中的Person类也能够被创立为一个接口。固然,与下面比拟存在一些区分,次要在于:一个接口并没有给出任何行动,而仅肯定了一组划定规矩。一个Person接口请求的是"你必需撑持AddFeedback()办法",而一个Person类可以供应一些AddFeedback()办法的缺省代码-你对之的了解可所以"假如你不选择撑持AddFeedback(),那末你应当供应一种缺省完成。"至于若何选择接口或基类则并不是本文的主题;然而,普通说来,你需求经由过程基类来完成一个缺省的办法。假如你可以复杂地勾画出你的类所要完成的一组希冀的功效,那末你也能够利用一个接口。
  3、使用多态性设计
  咱们将持续利用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类对象,从而履行其各自响应的准确操作。注重,这里针对分歧前提的回馈正文是分歧的。在实践使用法式开辟中能够不会呈现这类情况;我仅为了复杂地申明类完成中存在的区分。
  上面的一个示例利用了多态性。
<?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,挪用代码从不用懂得详细类的功效,而仅晓得基类就能够了。
  虽然我的示例其实不完善,然而,从挪用代码的角度,它已展现了多态性的根基用法。如今咱们需求剖析这些类的外部完成。从一个基类停止派生的一个最巨大的中央在于,该派生类可以存取父类的行动,这类情形经常是缺省的完成,然而也能够呈现在类承继链顶用于创立更加庞杂的行动。上面是这类情形的一个复杂展现。
<?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#中的办法重载。请记住,这仅是一个复杂化的示例,而且你编写的实践代码完整依附于你的实践工程。

  4、PHP 5中的迟绑定
  依我的意见,迟绑定恰是使得Java和C#如斯有目共睹的主要缘由。它们答应基类办法用"this"或$this来挪用办法(即便它们不存在于基类中或挪用一个基类中的办法,它有能够为承继类中的另外一个版本所取代)。你可以以为以下的完成在PHP中是答应的:
<?php
class Person{
 function AddFeedback($messageArray) {
  $this->ParseFeedback($messageArray);
  //写向数据库
 }
}
class David extends Person{
 function ParseFeedback($messageArray){
  // 停止一些剖析
 }
}
?>
  记住,在Person类中并没有ParseFeedback。如今,假定你具有这一局部完成代码(为了本例申明成绩起见),那末这会招致$myPerson成为一个David对象:
<?php
$myPerson = Person::GetPerson($name);
$myPerson->AddFeedback($messageArray);
?>
  呈现剖析毛病!大致毛病信息为,办法ParseFeedback其实不存在或一些相似的信息。关于PHP 5中的迟绑定咱们就会商这些!上面咱们再归结一下迟绑定的概念。
  迟绑定意味着,办法挪用在最初时辰才绑定到方针对象。这意味着,当该办法被运转时辰挪用时,那些对象已有了一种详细类型。在咱们下面的示例中,你挪用了David::AddFeedback(),而既然David::AddFeedback()中的$this援用一个David对象,那末你可以逻辑地假定ParseFeedback()办法是存在的--但现实上它其实不存在,由于AddFeedback()是在Person中界说的,而且从Person类中挪用ParseFeedback()。
不幸的是,没有复杂的办法来消弭PHP 5中的这类行动。这意味着,当你想创立一个天真的多态类条理时你能够有点力所不及。
  我必需指出,我选择PHP 5作为本文的表达言语仅仅是由于:这类言语并没有完成对象概念的完善笼统!由于PHP 5还处于其测试版本运转期,所以这是可以体谅的。别的,既然该言语中到场了笼统类和接口,迟绑定也应当被完成。
  5、小结
  至此,你应当根基懂得甚么是多态性和为何PHP 5在完成多态性方面其实不完善。普通说来,你应当晓得若何用一个多态性对象模子来封装有前提的行动。固然,如许会进步你的对象的天真性,而且意味着更少的代码完成。别的,经由过程封装知足必定前提的行动(详细要依附于对象的形态),你还进步了代码的明晰水平。

基础这个东西是个比较笼统的概念,如果你之前学习过c语言, c语言被认为是
爱飞 该用户已被删除
18#
发表于 2015-7-6 20:17:35 | 只看该作者
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
乐观 该用户已被删除
17#
发表于 2015-7-3 21:07:47 | 只看该作者
本文当是我的笔记啦,遇到的问题随时填充
简单生活 该用户已被删除
16#
发表于 2015-6-19 22:39:59 | 只看该作者
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
再现理想 该用户已被删除
15#
发表于 2015-6-12 10:48:28 | 只看该作者
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
谁可相欹 该用户已被删除
14#
发表于 2015-6-10 20:00:48 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
活着的死人 该用户已被删除
13#
发表于 2015-5-6 06:21:23 | 只看该作者
爱上php,他也会爱上你。
变相怪杰 该用户已被删除
12#
发表于 2015-4-28 16:39:54 | 只看该作者
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
老尸 该用户已被删除
11#
发表于 2015-4-22 04:51:38 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
不帅 该用户已被删除
10#
发表于 2015-4-16 05:33:26 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
灵魂腐蚀 该用户已被删除
9#
发表于 2015-4-11 18:42:27 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
莫相离 该用户已被删除
8#
发表于 2015-4-8 14:46:36 | 只看该作者
爱上php,他也会爱上你。
第二个灵魂 该用户已被删除
7#
发表于 2015-3-24 08:06:32 | 只看该作者
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
再见西城 该用户已被删除
6#
发表于 2015-3-12 12:57:56 | 只看该作者
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
飘灵儿 该用户已被删除
5#
发表于 2015-3-6 21:10:45 | 只看该作者
兴趣是最好的老师,百度是最好的词典。
蒙在股里 该用户已被删除
地板
发表于 2015-3-4 11:28:43 | 只看该作者
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
精灵巫婆 该用户已被删除
板凳
发表于 2015-2-15 12:58:46 | 只看该作者
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年  具体的记不清啦,囧。
小女巫 该用户已被删除
沙发
发表于 2015-2-6 09:29:28 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
楼主
发表于 2015-2-4 10:04:52 | 只看该作者
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 08:45

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表