PHP程序培训扩展内容-网页设计、网站制作php5面向对象编程.doc
《PHP程序培训扩展内容-网页设计、网站制作php5面向对象编程.doc》由会员分享,可在线阅读,更多相关《PHP程序培训扩展内容-网页设计、网站制作php5面向对象编程.doc(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、PHP程序培训扩展内容-网页设计、网站制作php5面向对象编程1 第一节-面向对象编程面向对象编程被设计来为大型软件项目提供解决方案,尤其是多人合作的项目. 当源代码增长到一万行甚至更多的时候,每一个更动都可能导致不希望的副作用. 这种情况发生于模块间结成秘密联盟的时候,就像第一次世界大战前的欧洲./haohappy注:喻指模块间的关联度过高,相互依赖性太强.更动一个模块导致其它模块也必须跟着更动.想像一下,如果有一个用来处理登录的模块允许一个信用卡处理模块来分享它的数据库连接. 当然出发点是好的,节省了进行另一个数据库连接的支出.然而有时,登录处理模块改变了其中一个变量的名字,就可能割断了两
2、者间的协议.导致信用卡模块的处理出错,进而导致处理发票的模块出错. 很快地,体系中所有无关的模块都可能由此出错.因此,我觉得有点戏剧性地,绝大多数程序员都对耦合和封装心存感激. 耦合是两个模块间依赖程度的量度. 耦合越少越好.我们希望能够从已有的项目中抽走一个模块并在另一个新项目中使用.我们也希望在某个模块内部大规模的更动而不用担心对其他模块的影响. 封装的原则可以提供这个解决方案.模块被看待成相对独立,并且模块间的数据通信通过接口来进行. 模块不通过彼此的变量名来窥探另一个模块,它们通过函数来礼貌地发送请求.封装是你可以在任何编程语言中使用的一个原则. 在PHP和许多面向过程的语言中,可以偷
3、懒是很有诱惑的.没有什么可以阻止你通过模块来构建一个假想的WEB. 面向对象编程是使程序员不会违背封装原则的一种方法.在面向对象编程中,模块被组织成一个个对象. 这些对象拥有方法和属性. 从抽象的角度来看,方法是一个对象的所做的动作,而属性是对象的特性.从编程角度来看,方法就是函数而属性是变量. 在一个理想化的面向对象体系中,每个部份都是一个对象. 体系由对象及对象间通过方法来形成的联系构成.一个类定义了对象的属性. 如果你在烘烤一组甜饼对象,那么类将会是甜饼机. 类的属性和方法是被调用的成员. 人们可以通过说出数据成员或者方法成员来表达.每种语言提供了不同的途径来访问对象. PHP从C+中借
4、用概念,提供一个数据类型用来在一个标识符下包含函数和变量。最初设计PHP的时候,甚至PHP3被开发出时,PHP并不打算提供开发超过10万行代码的大型项目的能力。随着PHP和Zend引擎的发展,开发大型项目变得有可能,但无论你的项目规模多大,用类来书写你的脚本将可以让代码实现重用。这是一个好主意,特别当你愿意与别人分享你的代码的时候。有关对象的想法是计算机科学上最令人兴奋的概念之一。开始很难掌握它,但我可以保证,一旦你掌握了它,用它的思维来思考将会非常自然。PHP5 的对象模型PHP5有一个单重继承的,限制访问的,可以重载的对象模型. 本章稍后会详细讨论的”继承”,包含类
5、间的父-子关系. 另外,PHP支持对属性和方法的限制性访问. 你可以声明成员为private,不允许外部类访问. 最后,PHP允许一个子类从它的父类中重载成员.PHP5的对象模型把对象看成与任何其它数据类型不同,通过引用来传递. PHP不要求你通过引用(reference)显性传递和返回对象. 在本章的最后将会详细阐述基于引用的对象模型. 它是PHP5中最重要的新特性.有了更直接的对象模型,就拥有了附加的优势: 效率提高, 占用内存少,并且具有更大的灵活性.在PHP的前几个版本中,脚本默认复制对象.现在PHP5只移动句柄,需要更少的时间. 脚本执行效率的提升是由于避免了不必要的复制. 在对象体
6、系带来复杂性的同时,也带来了执行效率上的收益. 同时,减少复制意味着占用更少的内存,可以留出更多内存给其它操作,这也使效率提高.Zand引擎2具有更大的灵活性. 一个令人高兴的发展是允许析构-在对象销毁之前执行一个类方法. 这对于利用内存也很有好处,让PHP清楚地知道什么时候没有对象的引用,把空出的内存分配到其它用途. 补充:PHP5的内存管理对象传递PHP5使用了Zend引擎II,对象被储存于独立的结构Object Store中,而不像其它一般变量那样储存于Zval中(在PHP4中对象和一般变量一样存储于Zval)。在Zval中仅存储对象的指针而不是内容(value)。当我们复制一个对象或者
7、将一个对象当作参数传递给一个函数时,我们不需要复制数据。仅仅保持相同的对象指针并由另一个zval通知现在这个特定的对象指向的Object Store。由于对象本身位于Object Store,我们对它所作的任何改变将影响到所有持有该对象指针的zval结构-表现在程序中就是目标对象的任何改变都会影响到源对象。.这使PHP对象看起来就像总是通过引用(reference)来传递,因此PHP中对象默认为通过“引用”传递,你不再需要像在PHP4中那样使用&来声明。垃圾回收机制某些语言,最典型的如C,需要你显式地要求分配内存当你创建数据结构。一旦你分配到内存,就可以在变量中
8、存储信息。同时你也需要在结束使用变量时释放内存,这使机器可以空出内存给其它变量,避免耗光内存。PHP可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。例如:<?php class Person function sendEmailTo() $haoha
9、ppy = new Person( ); / 建立一个新对象: 引用计数 Reference count = 1 $haohappy2 = $haohappy; / 通过引用复制: Reference count = 2 unset($haohappy); / 删除一个引用: Reference count = 1 sendEmailTo($haohappy2); / 通过引用传递对象: / 在函数执行期间: / Reference count = 2 / 执行结束后: / Reference count = 1unset($haohappy2); / 删除引用: Reference coun
10、t = 0 自动释放内存空间?>当你声明一个类,你需要列出对象应有的所有变量和所有函数—被称为属性和方法. 3.1.1中显示了一个类的构成. 注意在大括号()内你只能声明变量或者函数. 3.1.2中显示了如何在一个类中定义三个属性和两个方法.3.1.1class Name extends Another Class Access Variable Declaration Access Function Declaration 3.1.2/定义一个跟踪用户的类 class User /属性 public $name; private $password, $lastLogin;
11、/方法 public function _construct($name, $password) $this->name = $name; $this->password = $password; $this->lastLogin = time(); $this->accesses+; / 获取最后访问的时间 function getLastLogin() return(date("M d Y", $this->lastLogin); /创建一个对象的实例 $user = new User("Leon", "sdf
12、123");/获取最后访问的时间 print($user->getLastLogin() ." ");/打印用户名 print("$user->name "); ?>当你声明属性,你不需要指明数据类型. 变量可能是整型,字符串或者是另一个对象,这取决于实际情况.在声明属性时增加注释是一个好主意,标记上属性的含义和数据类型.当你声明一个方法,你所做的和在类外部定义一个函数是一样的. 方法和属性都有各自的命名空间. 这意味着你可以安全地建立一个与类外部函数同名的方法,两者不会冲突. 例如,一个类中可以定义一个名为date()的方法
13、. 但是你不能将一个方法命名为PHP的关键字,如for或者while.类方法可能包含PHP中所谓的type hint. Type hint 是另一个传递参数给方法的类的名字. 如果你的脚本调用方法并传递一个不是类的实例的变量,PHP将产生一个”致命(fatal)错误” . 你可能没有给其它类型给出type hint,就像整型,字符串,或者布尔值. 在书写的时候, type hint是否应当包含数组类型仍存在争议.Type hint是测试函数参数或者运算符的实例的数据类型的捷径. 你可能总是返回这个方法. 确认你强制让一个参数必须是哪种数据类型,如整型. 3.2.1 确保
14、编译类只产生Widget的实例.3.2.1/组件 class Widget public $name=none; public $created=FALSE; /装配器 class Assembler public function make(Widget $w) print("Making $w->name "); $w->created=TRUE; /建立一个组件对象 $thing = new Widget; $thing->name = Gadget;/装配组件 Assembler:make($thing); ?>除了传递参数的变量外,方法含有
15、一个特殊的变量. 它代表类的个别实例. 你应当用这个来指向对象的属性和其它方法.一些面向对象的语言假设一个不合格的变量提交给本地属性,但在PHP中方法的任何变量只是在方法的一定范围内. 注意在User类的构造函数中这个变量的使用(3.1.2).PHP在属性和方法声明前定义一个访问限定语,如public,private和protected. 另外,你可以用”static”来标记一个成员. 你也可以在类中声明常量. 本章稍后会有不同访问方式的相关讨论.你可以在一行中列出相同访问方式的几个属性,用逗号来分隔它们. 在3.1.2中,User类有两个private属性-$pass
16、word和$lastLogin.第四节-构造函数和析构函数如果你在一个类中声明一个函数,命名为_construct,这个函数将被当成是一个构造函数并在建立一个对象实例时被执行. 清楚地说,_是两个下划线. 就像其它任何函数一样,构造函数可能有参数或者默认值. 你可以定义一个类来建立一个对象并将其属性全放在一个语句(statement)中.你也可以定义一个名为_destruct的函数,PHP将在对象被销毁前调用这个函数. 它称为析构函数.继承是类的一个强大功能. 一个类(子类/派生类)可以继承另一类(父类/基类)的功能. 派生类将包含有基类的所有属性和方法,并可以在派生类中加上其他属性和方法.
17、你也可以覆写基类的方法和属性. 就像3.1.2中显示的,你可以用extends关键字来继承一个类.你可能想知道构造函数是如何被继承的. 当它们和其它方法一起被继承时,他们不会在创建对象时被执行.如果你需要这个功能,你需要用第二章提到的:运算符. 它允许你指向一块命名空间. parent指向父类命名空间,你可以用parent:_construct来调用父类的构造函数.一些面向对象语言在类之后命名构造函数. PHP的前几个版本也是如此,到现在这种方法仍然有效.也就是:如果你把一个类命名为Animal并且在其中建立一个命名也是Animal的方法,则这个方法就是构造函数.如果一个类的同时拥有_cons
18、trut构造函数和与类名相同的函数,PHP将把_construct看作构造函数.这使得用以前的PHP版本所写的类仍然可以使用. 但新的脚本(PHP5)应当使用_construct.PHP的这种新的声明构造函数的方法可以使构造函数有一个独一无二的名称,无论它所在的类的名称是什么. 这样你在改变类的名称时,就不需要改变构造函数的名称.你可能在PHP中给构造函数一个像其它类方法一样的访问方式. 访问方式将会影响从一定范围内实例化对象的能力. 这允许实现一些固定的设计模式,如Singleton模式.析构函数,相反于构造函数. PHP调用它们来将一个对象从内存中销毁. 默认地,PHP仅仅释放对象属性所占
19、用的内存并销毁对象相关的资源. 析构函数允许你在使用一个对象之后执行任意代码来清除内存.当PHP决定你的脚本不再与对象相关时,析构函数将被调用. 在一个函数的命名空间内,这会发生在函数return的时候. 对于全局变量,这发生于脚本结束的时候. 如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值. 通常将变量赋值勤为NULL或者调用unset .下面的例子中,计算从类中实例化的对象的个数. Counter类从构造函数开始增值,在析构函数减值.一旦你定义了一个类,你可以用new来建立一个这个类的实例. 类的定义是设计图,实例则是放在装配线上的元件. New需要类的名称,并返回该类
20、的一个实例. 如果构造函数需要参数,你应当在new后输入参数.class Counter private static $count = 0;function _construct() self:$count+; function _destruct() self:$count-; function getCount() return self:$count; /建立第一个实例 $c = new Counter();/输出1 print($c->getCount() . " ");/建立第二个实例 $c2 = new Counter();/输出2 print($c-&
21、gt;getCount() . " ");/销毁实例 $c2 = NULL;/输出1 print($c->getCount() . " "); ?>当你新建了一个实例,内存会被准备来存储所有属性. 每个实例有自己独有的一组属性. 但方法是由该类的所有实例共享的.第五节-克隆PHP5中的对象模型通过引用来调用对象, 但有时你可能想建立一个对象的副本,并希望原来的对象的改变不影响到副本 . 为了这样的目的,PHP定义了一个特殊的方法,称为_clone. 像_construct和_destruct一样,前面有两个下划线.默认地,用_clone方法将
22、建立一个与原对象拥有相同属性和方法的对象. 如果你想在克隆时改变默认的内容,你要在_clone中覆写(属性或方法).克隆的方法可以没有参数,但它同时包含this和that指针(that指向被复制的对象). 如果你选择克隆自己,你要小心复制任何你要你的对象包含的信息,从that到this. 如果你用_clone来复制. PHP不会执行任何隐性的复制,下面显示了一个用系列序数来自动化对象的例子:class ObjectTracker /对象跟踪器 private static $nextSerial = 0; private $id; private $name;function _constru
23、ct($name) /构造函数 $this->name = $name; $this->id = +self:$nextSerial; function _clone() /克隆 $this->name = "Clone of $this->name" $this->id = +self:$nextSerial; function getId() /获取id属性的值 return($this->id); function getName() /获取name属性的值 return($this->name); $ot = new Obj
24、ectTracker("Zeevs Object"); $ot2 = clone$ot;/输出: 1 Zeevs Object print($ot->getId() . " " . $ot->getName() . "");/输出: 2 Clone of Zeevs Object print($ot2->getId() . " " . $ot2->getName() . ""); ?> 第六节-访问属性和方法一个对象实例的属性是变量,就像PHP的其他变量一样. 但是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PHP 程序 培训 扩展 内容 网页 设计 网站 制作 php5 面向 对象 编程
限制150内