‘壹’ 面向对象编程是什么意思
它是一种编程风格,就是把一切东西看成一个个对象,比如人,车,面包,等等,然后把这些对象拥有的属性变量,比如年龄,民族,工作地点,变质期,寿命,还有操作这些属性变量的函数打包成一个类来表示,这个类的一个抽象就是一个对象,比如人这个类包含一些属性,比如年龄,名字,住址等,他还有一些对别人告诉这些属性的功能,比如:说,看,走等!!这就是的面向对象的特点!!!
‘贰’ php接口开发教程
PHP与大多数面向对象编程语言一样,不支持多重继承.也就是说每个类只能继承一个父类.为了解决这个问题,PHP引入了接口,接口的思想是指定了一个实现了该接口的类必须实现的一系列方法.接口是一种特殊的抽象类,抽象类又是一种特殊的类,所以接口也是一种特殊的类,为什么说接口是一种特殊的抽象类呢?如果一个抽象类里面的所有的方法都是抽象方法,那么我们就换一种声明方法使用“接口“;也就是说接口里面所有的方法必须都是声明为抽象方法,另外接口里面不能声明变量(但可声明常量constant),而且接口里面所有的成员都是public权限的。所以子类在实现的时候也一定要使用public权限实限。
声明一个类的时候我们使用的关键字是”class”,而接口一种特殊的类,使用的关键字是“interface”;
类的定义: class 类名{ … } ,接口的声明:interface 接口名{ …}
代码
代码
<?php
//定义一个接口使用interface关键字,“One”为接口名称
interface One
{
//定义一个常量
const constant = 'constant value';
//定义了一个抽象方法”fun1”
public function fun1();
//定义了抽象方法”fun2”
public function fun2();
}
?>
上例中定义了一个接口”one”,里面声明了两个抽象方法“fun1”和”fun2”,因为接口里面所有的方法都是抽象方法,所以在声明抽象方法的时候就不用像抽象类那样使用”abstract”这个关键字了,默认的已经加上这个关键字,另外在接口里边的”public”这个访问权限也可以去掉,因为默认就是public的,因为接口里所有成员都要是公有的,所在对于接口里面的成员我们就不能使用“private”的和”protected”的权限了,都要用public或是默认的。另外在接口里面我们也声明了一个常量“constant“, 因为在接口里面不能用变量成员,所以我们要使用const这个关键字声明。
因为接口是一种特殊的抽象类,里面所有的方法都是抽象方法,所以接口也不能产生实例对象; 它也做为一种规范,所有抽象方法需要子类去实现。
我们可以使用”extends”关键字让一个接口去继承另一个接口:
<?php
//使用”extends”继承另外一个接口
interface Two extends One
{
function fun3();
function fun4();
}
?>
而我们定义一接口的子类去实现接口中全部抽象方法使用的关键字是”implements”,而不是我们前面所说的”extends”;
代码
<?php
//使用“implements”这个关键字去实现接口中的抽象方法 接口和类之间
class Three implements One
{
function fun1()
{
…
}
function fun2()
{
…
}
}
//实现了全部方法,我们去可以使用子类去实例化对象了
$three=new Three();
?>
我们也可以使用抽象类,去实现接口中的部分抽象方法,但要想实例化对象,这个抽象类还要有子类把它所有的抽象方法都实现才行;
在前面我们说过,PHP是单继承的,一个类只能有一父类,但是一个类可以实现多个接口,就相当于一个类要遵守多个规范,就像我们不仅要遵守国家的法律,如果是在学校的话,还要遵守学校的校规一样;
<?php
//使用implements实现多个接口
class Four implemtns 接口一, 接口二, ….
{
//必须把所有接口中的方法都要实现才可以实例化对象。
}
?>
PHP中不仅一个类可以实现多个接口,也可以在继承一个类的同时实现多个接口, 一定要先继承类再去实现接口;
<?php
//使用extends继承一个类,使用implements实现多个接口
class Four extends 类名一 implemtns 接口一, 接口二, ….
{
//所有接口中的方法都要实现才可以实例化对象
………
}
?>
‘叁’ 在php程序员里用面向对象写sql语句好还面向过程好那个效率更快、速度更高
面向对象与面向过程在许多编程语言中只能使用二者之一来进行编程,但是PHP语言与其他编程语言有不同之处,那就是我们可以自由的选择或者将如果你是刚接触PHP,用PHP面向过程的风格来书写代码很可能是你唯一的选
面向对象与面向过程在许多编程语言中只能使用二者之一来进行编程,但是PHP语言与其他编程语言有不同之处,那就是我们可以自由的选择或者将 如果你是刚接触PHP,用PHP面向过程的风格来书写代码很可能是你唯一的选择。但是如果你经常上PHP论坛和新闻组的话,你应该会看到有关“对象”的文章。你也可能看到过如何书写面向对象的PHP代码的教程。或者你也可能下载过一些现成的类库,并尝试着去实例化其中的对象和使用类方法--尽管你可能没有真正理解这些类为什么可以工作,或者为什么需要使用PHP面向对象的方法来实现功能。
应该使用“面向对象”的风格还是“面向过程”的风格?双方各有支持者。像“对象是低效的”或“对象非常棒”这样的议论也时有耳闻。本文不尝试轻易判定两种方法的哪种具有绝对的优势,而是要找出每种方法的优缺点。
以下是PHP面向过程风格的代码示例:
<?php
print"Hello,world.";
?>
以下是PHP面向对象风格的代码示例:
<?php
classhelloWorld{
functionmyPrint(){
print"Hello,world.";
}
}
$myHelloWorld=newhelloWorld();
$myHelloWorld->myPrint();
?>
如果你想了解一些“面向对象”的基本知识,请使用Google搜索,网络上有非常多精彩的文章。
谁像这样写代码?
为了理解为什么这个论题成为论坛上口水战的导火线,我们看一些每个阵营的比较极端的例子。我们看看“过程狂热”和“对象狂热”。看看他们的观点听起来是不是有点熟悉。
过程狂热
过程狂热曾在上课时被计算机教师批评,因为这种方法没有使用更加抽象的实现方式。而支持PHP面向过程者的观点“它可以工作!”并不能提高其编程水平和档次。毕业后他们可能找到一个工作,写驱动程序,文件系统或其它的偏向底层的编程,他们的注意力集中于速度和代码的精炼。
“过程狂热”极端的例子是抵制对象,抵制抽象化。他们总在想着如何让程序运行起来更快,而不在乎别人是否能读懂他们的代码。他们常常把编程当成竞赛而不是团队活动。除了PHP外,他们最喜爱的编程语言是C和汇编。在PHP世界中他们可能会开发PECL模块,贡献出高效率的代码。
对象狂热
对象狂热者热衷于在任何时候使用PHP面向对象的风格来书写代码。他们没有真正考虑过用这种方式是否会影响程序的执行效率。有时候让人觉得他们更享受抽象的设计概念而不是现实的代码。他们通常很可能是项目管理者或文档书写者。
对象狂热者指出,如果没有抽象的设计方法我们仍然在使用0和1进行编程。他们喜欢用伪码来描述问题。极端的例子是对象狂热者即使知道有时候会牺牲效率仍然使用对象。除了PHP,他们最喜欢的语言是Java和Smalltalk。在PHP世界中,他们可能会开发PEAR模块,贡献文档化非常好,易于维护的代码。
不要偏激和讽刺
你知道为什么论坛上总是充斥着各种偏见吗?你的经验阅历,你对新事物的态度都可能是原因。作为程序员,我们需要时常注意这些偏见并以开放的心态去学习新事物。
你的编码倾向?
考虑一下当你书写PHP代码时有什么偏好或倾向。通常这些偏好是比较隐晦的。有时候你可能在每个项目中有着同样的偏好。我个人倾向于“优雅”,但我不想在此定义如何才是“优雅”的代码,那应当出现在另一篇文章里。但是,理论化的偏好不一定适合于实际项目—相反地,他们常常是一种偏见。
理论化的倾向
•用最少行数的代码提供一个完整的解决方案
•在问题层次上考虑问题
这听起来似乎很不错。但“代码行数最少”如何来衡量呢?要把代码注释算在内吗?我们是否要把每一行都串起来而只用分号来区分呢?大括号呢?很明显这种想法是错误的。
再解释一下什么是“问题层次”。这是否意味着在我们的方案中的每个概念都需要建立一个类?或者需要在每个独立的文件里保持问题的每个部分,并建立一个复杂的文件树来与现实中的问题相对应?就是这样的想法--为每个想法准备一个文件或类!
很明显这些概括极端化后变得可笑。但现实中存在更微妙的证明。是否常常会有程序员在团队合作时插入一行复杂的,强大的但没有注释的代码?这对于接手维护这些代码的人来说无疑是非常令人沮丧的事。相反地,是否你的官僚的自以为是的上一级程序员常常“横冲直撞”般地,建立接口和类?而那些接口和类不仅仅限制了负责实现的程序员,也限制了效率和灵活性,导致客户要求扩展程序时手足无措。这些都是以上各种倾向的微妙的证明。
实际倾向
一个项目开始的时候,首先要寻求实际的编码目的和方向。这个项目的实现目标是什么?下面是可能是答案。
•开发快,发布快
•尽可能快地运行
•易于维护,改进和扩展
•发布一个API
第一、二个方向倾向于使用过程化的风格,而最后两个倾向于使用PHP面向对象的风格。
什么时候某种方式更有效?
现在让我们试着评价每种方式在现实中的优势。
PHP面向过程案例
有关PHP的面向过程化编程优势的一个基础性的论据是:PHP是一个解释性的语言--这意味着,不像其它的语言一样,它不会被编译成一个可执行的包,而是被解释并马上执行。它是一种脚本语言并存储于文本文件中(例外的,如果使用了Zend编译工具)。
另一个反对在PHP4及更低版本中使用面向对象方式进行编码的理由是:在PHP的早期版本中对象的功能并没有经过良好设计。就像Rasmus曾说过的:“那是事后才想起要增加的功能”。这意味着在PHP4及更早的版本中,对象的效率是个问题。但PHP5出来后,这种情形会有改观。
以下两个最流行的PHP程序--OsCommerce和PhpMyAdmin.主要使用面向过程的编码方式。它们构建起来很快,运行起来也很快。两者都很自然地采用嵌入HTML的方法。
OsCommerce
OsCommerce实际上使用了很多对象,但绝大部分功能是通过“过程”来实现的。我曾经hack过OsCommerce,为其增添一些对于客户非常实用的自定义功能。这个过程是挺麻烦的,因为OsCommerce中的很多过程代码,没有使用模板化的系统,并且设计成多语言版,所以需要花一定的时间才能上手。但是它可以工作,事实上它已经很好地运行在数目众多的电子商务站点上了。OsCommerce同时提供了一个论坛和一个开发框架用来开发模块和插件。因此,现在已经有了很多其它开发者提供的实用的功能模块。
PhpMyAdmin
PhpMyAdmin直接使用的类只有一个:MimerSQLValidator类,依赖于PEAR包中的Mail_Mime,Net_DIME和SOAP。这可能是考虑到开发的方便:利用现成的可以实现目的的代码。除此之外,一切都是面向过程的,HTML和PHP代码也是混杂在一起。
PhpMyAdmin是我几乎每天都要用到的一个工具,用来对少量的数据表进行不太复杂的处理。有时我甚至鼓励我的客户将它当作后端的管理工具来使用(当然我会限制他们的权限)。PhpMyAdmin的表现非常棒,也很快。有时我想在一些项目中扩展PhpMyAdmin作为后端的管理工具,利用它的一些新功能如数据查询语句书签可以很方便地展示给我的客户和编辑。随着每个新版本的推出,PhpMyAdmin越来越实用,功能越来越强大。 软件开发网
PHP面向过程小结
以上两个使用面向过程风格的程序都有非常好的文档和代码注释。OsCommerce提供的开发框架可以增加维护性和扩展性。但是两者都没有提供API,不能扩展程序到另外的体系中。
如果你想把OsCommerce整合到一个帐单程序中,需要花费大量的时间和精力,就像扩展PhpMyAdmin成一个供客户使用的后端管理工具。不过从它们设计的目的来看,确实在各自的领域中都表现地很出色。
PHP面向对象案例
支持面向对象风格者的观点都集中于扩展性和封装。仅仅用面向对象的方式来写代码不会为你的代码产生文档,但它可以鼓励你为之添加文档。并且,为了易于扩展,你可能会写一个API。PHP5许诺让面向对象编程更加愉快。我开玩笑地将它称为PHP中的”Java2”版本,因为它整合了Java中的许多特性,像接口,面向对象模型,try-catch语句等。但即使在对面向对象支持不
力的PHP4中,仍然出现了许多出色的面向对象应用程序。
Smarty
Smarty用来构建带有复杂表单并基于模板的站点。最近,我写了一个可以完全换“皮肤”的在线考试系统—可以不用改变任何底层的代码和功能就可以将整个站点的外观界面和风格完全改变。为了让设计师可以易于设计新的界面,我设计了一个自定义的标签库作为Smarty标签库的扩展。可以像这样简单地插入:
["|"]
在一个页面的顶端有分隔开的导航。因为Smarty已经提供了非常强大的机制来表现变量中包含的数据,这是一个映射较复杂的Smarty标签到skin标签的简单过程。
由于Smarty封装成一个类,并且它的方法都有很详尽的文档,使得使用模板的过程变得令人难以置信地易于扩展。同时,通过强制性地只能显式地传递你要使用的变量给Smarty模板的方法,Smarty也为PHP的环境变量提供了一个保护层。这种方法有助于在Smarty模板设计师和程序员间建立安全、可靠的工作关系。
Fpdf
FPDF是一个非常优秀的工具。如果你被改来改去的pdflib的API所困惑,或者不愿为商业化的解决方案而交钱;或者由于共享主机的限制,无法使用扩展模块—请考虑使用这个免费的,纯PHP构建的PDF生成工具。
这个类有很好的文档,包括许多很好的例子来阐述如何在PDF中布局文本和图片。在上面提到的同一个在线学习站点我使用FPDF来动态生成PDF文件,使用truetype字体和300dpi精度的图像。在PHP中实例化FPDF类并进行PDF操作并不会花费太多额外的时间,因为PDF本身就可能需要花费几分钟来下载。事实上,动态生成并传送一个PDF所花的时间不比当使用一个慢速的网络连接来传送静态PDF文件所花的时间多。这都是相对而言的。并且,由于FPDF是基于类的,他可以被扩展。事实上,有些类方法虽然存在但还没有完全实现,仅作为一个框架,这可以为你在子类中建立你自己的内容(如自定义的头尾元素)提供向导。
PHP面向对象小结
Smarty和FPDF都提供了带有良好文档的API来扩展主类。这说明了在类的内部组织方法和数据的必要性--有时同样的功能可以用函数和全局变量来完成,但这样不易于扩展。并且,使用对象对跟踪和保持PDF或HTML文档的风格非常有帮助,你可以将同样的数据用不同的格式来发布。Smarty和FPDF都是使用对象来建立灵活实用的类库的极好的例子。
为什么两种方式都是必需的?
回到我们充满热情的程序员身上,我们开始赞美他们:
•我们欣赏Smarty和FPDF的实用性和扩展性
•我们欣赏osCommerce和phpMyAdmin的运行速度和良好表现
这种欣赏还包括对PHP的一些基础开发。PECL和PEAR都收到了很多赞扬和批评。我想这两个项目为阐明PHP面向过程和面向对象编程的区别提供了很好的例子。
PECl提供了PHP的扩展库,用C和面向过程的方式开发,注重速度和简洁精炼。通常,这些都是从已经存在的LGPL软件中移植而来,其中许多有趣的特性已经加入PHP。毕竟,PHP是用C写的。
PEAR则贡献了很多有趣的类如建立Excel表或改变DNS记录等。使用PEAR类库可以为你节约大量时间,甚至可以让你在不怎么熟悉PHP的情况进行开发—“我不理解但它能用!”。
总结
希望本文能加深你对PHP面向对象和PHP面向过程的两种编程方式的理解,并且更重要地—鼓励你在更具体的细节上进行探索。我希望你会有自己的想法,并在实际开发中检验你的项目开发倾向,总结出更多实际的案例,并不啬写些针对本文的评论。
总之,每种方式都有其优势的一面,纠缠于争论不如离开去写些实际的代码!
‘肆’ php中这样写$proc->PM是什么意思
$proc是一个类,$proc->PM表示引用类$proc中的PM属性的值。
你去了解一下PHP的面向对象编程就知道了。
‘伍’ php中面向对象编程是什么意思,到底用在什么地方,用一个项目中的实际例子来举例说明
可以这样理解,
1、类是模具,对象是模具生成的产品,就是印刷术一样,有了一个字一个字的模子,要印出一个字来就方便了,想印就印,你可以印,我也可以印。
2、在PHP中怎么做一个模具出来呢,就用 class申明,它就表示你要造一个模具了,但这个模具是做什么用的,就要在里面添加函数来表达了,函数名就是这个类的方法名,函数完成的功能就是类的方法。当然函数要实现功能代码中肯定要用到变量,这个就是所谓的类的成员以或者说成是类的属性。
3、有了类的属性有了类的方法,这就完成了一个类的定义,也就是模具做好了,接下来要理解的就是,怎样去用这个类了。就好像是要看一本书你不可能到印刷厂去把字的模具拿来拼成一页一页书来看吧,肯定是在纸上印刷出来。这个印刷的过程就是对象生成的过程也叫类的实例化。PHP中用new关键字来生成对象。比如前面定义的类名为 牛,这个牛有一个方法(函数)是:耕地。当然耕地这个函数,要怎样去实现那是另外要的事情了。现在要说的是怎么用牛的耕地方法,首先实例化,在PHP中这样表示:牛1= new 牛。这样 牛这个类 就有了一个具体可以使唤的牛1了 要想用牛1的耕地方法,意思就是“调用类(对象)的方法”,PHP中这样表示,牛1->耕地;如果你想要100头牛,就new100个出来就行,而不用每当要用牛的时候都去写牛的代码和牛耕地的代码了。
4、上面说的是一个理解过程,要实现就要用到具体的PHP的语法了,比如怎样申明变量 ,怎样赋值,怎样用运算符来运算,怎样写循环结构,怎样写选择结构,等等 。
‘陆’ PHP的其他方面
PHP 在数据库方面的丰富支持,也是它迅速走红的原因之一,它支持下列的数据库或是数据文件:
Adabas 、D、 DBA、dBase 、dbm 、filePro 、Informix 、InterBase、mSQL 、Microsoft SQL Server、·MySQL、Solid、Sybase、 Oracle 、PostgreSQL
而在 Internet 上它也支持了相当多的通讯协议 (protocol),包括了与电子邮件相关的 IMAP,POP3;网管系统 SNMP;网络新闻NNTP;帐号共用 NIS;全球信息网 HTTP 及 Apache 服务器;目录协议 LDAP 以及其它网络的相关函数。
除此之外,用 PHP 写出来的 Web 后端 CGI 程序,可以很轻易的移植到不同的操作系统上。例如,先以 linux 架的网站,在系统负荷过高时,可以快速地将整个系统移到 SUN 工作站上,不用重新编译 CGI 程序。面对快速发展的 Internet,这是长期规划的最好选择。
相关语法及概念
php 支持八种原始类型。
四种标量类型:boolean(布尔型) integer(整型) float(浮点型,也作“double”) string(字符串)
两种复合类型:array(数组)object(对象)
最后是两种特殊类型:resource(资源)NULL
为了确保代码的易读性,本手册还介绍了一些伪类型:mixed、number、callback
语法(例子中均忽略了PHP代码边界符 <?php ?>):
注释的语法有三种: //comment这个是单行注释/*comment*/这个是多行注释#comment这个是脚本类型注释,很少用基本的结构控制语句: //分支结构(选择结构)if(condition){//Statement}if(condition){//Statement}else{//Statement}if(condition){//Statement}elseif(condition){//Statement}//多分支结构switch($变量){case'值'://Statementbreak;case'值2'://Statementbreak;default://Statement}//循环结构while(condition){//Statement}do{//Statement}while(condition);for(初始化;判断;变化){//Statement}//数组遍历专用循环语句foreach($Arrayas$value){echo$value;}foreach($Arrayas$key=>$value){echo$key;echo$value;}一个PHP实例: <html><head><title>Firstprogram</title></head><body>//php中string类型的拼接符和其它大多数采用+号运算符不一样,而是采用.号运算//在一般语言中用于对象属性和方法调用的.运算符,则和C语言的结构体一样用=><?phpechohelloworld.!;?></body></html>php对面向对象的支持
面向对象编程的概念:
不同的作者之间说法可能不一样,但是一个OOP语言必须有以下几方面:
1.抽象数据类型和信息封装
2.继承
3.多态
在PHP中是通过类来完成封装的: //在OOP类中,通常采用大双驼峰命名法,每个单词的首字母都大写classSomething{//作用域修饰符:public公共的;private私有的;protected受保护的;//属性的名称一般用全小写private$x=null;//在编程建议中,内部使用的属性应该给私有修饰符,然后通过方法取值赋值//方法的名称一般用小驼峰命名法,第一个单词全小写,剩下的单词首字母大写//因为PHP不会自动为变量使用$this所以必须主动加上$this伪变量来指向操作的对象publicfunctionsetX($v){$this->x=$v;}publicfunctiongetX(){return$this->x;}}当然你可以按自己的喜好进行定义,但最好保持一种标准,这样会更有效。数据成员在类中使用var声明来定义,在给数据成员赋值之前,它们是没有类型的。一个数据成员可以是一个整数,一个数组,一个相关数组(associative array)或者是一个对象。方法在类中被定义成函数形式,在方法中访问类成员变量时,你应该使用$this->name,否则对一个方法来说,它只能是局部变量。
使用new操作符来创建一个对象: $obj=newSomething;然后你可以使用成员函数通过: $obj->setX(5);$see=$obj->getX();echo$see;在这个例子中,setX成员函数将5赋值给对象的成员变量x(不是类的),然后getX返回它的值5。可以象:$obj->x=6那样通过类引用方式来存取数据成员,这不是一个很好的OOP习惯。我强烈建议通过方法来存取成员变量。如果你把成员变量看成是不可处理的,并且只通过对象句柄来使用方法,你将是一个好的OOP程序员。不幸的是,PHP不支持声明私有成员变量,所以不良代码在PHP中也是允许的。继承在PHP中很容易实现,只要使用extends关键字。 classAnotherextendsSomething{private$y;publicfunctionsetY($v){$this->y=$v;}functiongetY(){return$this->y;}}Another类的对象拥有了父类(Something)的全部的数据成员及方法,而且还加上了自己的数据成员和方法。
你可以使用 $obj2=newAnother;$obj2->setY(5);echo$obj2->getY();PHP只支持单继承,所以你不能从两个或两个以上类派生出新的类来。你可以在派生类中重定义一个方法,如果我们在Another类中重定义了getX方法(方法重写),我们就不能使 用Something中的getX方法了。如果你在派生类中声明了一个与基派同名的数据成员,那么当你处理它时, 它将“隐藏”基类的数据成员。
你可以在你的类中定义构造函数。构造函数是一个与类名同名的方法,当你创建一个类的对象时会被调用,例如: classSomething{private$x=null;//新版本的构造函数放弃使用类名,而统一使用__construct()publicfunction__construct($x){$this->x=$x;}publicfunctionsetX($v){$this->x=$v;}publicfunctiongetX(){return$this->x;}//析构函数publicfunction__destruct(){}}所以你可以创建一个对象,通过: $obj=newSomething(6);构造函数会自动地把6赋值给数据变量x。构造函数和方法都是普通的PHP函数(”__“两个下划线,魔术方法),所以你可以使用缺省参数。 publicfunction__construct($x=3,$y=5){}接着: $obj=newSomething();//x=3andy=5$obj=newSomething(8);//x=8andy=5$obj=newSomething(8,9);//x=8andy=9缺省参数使用C++的方式,所以你不能忽略Y的值,而给X一个缺省参数,参数是从左到右赋值的,如果传入的参数少于要求的参数时,其作的将使用缺省参数。
当一个派生类的对象被创建时,只有它的构造函数被调用,父类的构造函数没被调用,如果你想调用基类的构造函数,你必须要在派生类的构造函数中用parent::__construct()调用。可以这样做是在派生类中所有父类的方法都是可用的。 classAnotherextendsSomething{publicfunction__construct(){parent::__construct(5,6);//显示调用基类构造函数}}OOP的一个很好的机制是使用抽象类。抽象类是不能实例化,只能提供给派生类一个接口。设计者通常使用抽象类来强迫程序员从基类派生,这样可以确保新的类包含一些期待的功能。在PHP中没有标准的方法,但是:如果你需要这个特性,可以通过定义基类,并在它的构造函数后加上die 的调用,这样就可以保证基类是不可实例化的,在每一个方法(接口)后面加上die 语句,所以,如果一个程序员在派生类中没有覆盖方法,将引发一个错误。而且因为PHP 是无类型的,你可能需要确认一个对象是来自于你的基类的派生类,那么在基类中增加一个方法来实义类的身份(返回某种标识id),并且在你接收到一个对象参数时校验这个值。当然,如果一个不好的邪恶程序员在派生类中覆盖了这个方法,这种方法就不起作用了,不过一般问题多在懒惰的程序员身上,而不是邪恶的程序员。
当然,能够让基类对程序员无法看到是很好的,只要将接口打印出来做他们的工作就可以了。PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
重载(与覆盖不同)在PHP中不支持,因为PHP是弱类型语言。在OOP中,你可以重载一个方法来实现两个或重多的方法具有相同的名字,但是有不同数量或类型的参数(这要看语言)。PHP 是一种松散类型的语言,所以通过类型重载不起作用,然而通过参数的个数不同来重载也不起作用。
有时在OOP中重载构造函数非常好,这样你可以通过不同的方法创建对象(变量函数)。在PHP中实现它的技巧是: classMyclass{publicfunctionMyclass(){$name=Myclass.func_num_args();//这个函数返回的是传过来参数的个数$this->$name();//这里使用的是一个变量函数,以这个变量的值作为函数的名称调用}publicfunctionMyclass1($x){//code}publicfunctionMyclass2($x,$y){//code}}通过在类中的额外的处理,使用这个类对用户是透明的: $obj1=newMyclass('1');//将调用Myclass1$obj2=newMyclass('1','2');//将调用Myclass2有时这个非常好用。
多态
多态是对象的一种能力,它可以在运行时刻根据传递的对象参数,决定调用哪一个对象的方法。例如,如果你有一个figure的类,它定义了一个draw的方法。并且派生了circle和rectangle 类,在派生类中你覆盖了draw方法,你可能还有一个函数,它希望使用一个参数x,并且可以调用$x->draw()。如果你有多态性,调用哪个draw方法就依赖于你传递给这个函数的对象类型。
多态性在象PHP这样的解释语言(想象一下一个C++编译器生成这样的代码,你应该调用哪一个方法?你也不知道你拥有的对象是什么类型的,好,这不是重点)是非常容易和自然的。所以PHP当然支持多态性。 classCalc{functionniceDrawing($x){//假设这是Board类的一个方法$x->draw();}}classCircle{publicfunctiondraw(){echo画了一个圆;}}classRectangle{publicfunctiondraw(){echo画了一个矩形;}}$board=newCalc;$obj=newCircle(3,187);$obj2=newRectangle(4,5);$board->niceDrawing($obj);//将调用Circle的draw方法$board->niceDrawing($obj2);//将调用Rectangle的draw方法用PHP进行面向对象编程
一些纯化论者(purists)可能会说PHP不是一个真正的面向对象的语言,这是事实。PHP 是一个混合型语言,你可以使用OOP,也可以使用传统的过程化编程。然而,对于大型项目,你可能想/需要在PHP 中使用纯的OOP去声明类,而且在你的项目只用对象和类。
随着项目越来越大,使用OOP可能会有帮助,OOP代码很容易维护,容易理解和重用。这些就是软件工程的基础。在基于web的项目中应用这些概念就成为将来网站成功的关键。
高级OOP技术
在看过基本的OOP概念后,我就可以向你展示更高级的技术:
序列化(Serializing)
PHP不支持永久对象,在OOP中永久对象是可以在多个应用的引用中保持状态和功能的对象,这意味着拥有将对象保存到一个文件或数据库中的能力,而且可以在以后装入对象。这就是所谓的序列化机制。PHP 拥有序列化方法,它可以通过对象进行调用,序列化方法可以返回对象的字符串表示。然而,序列化只保存了对象的成员数据而不包括方法。
在PHP4中,如果你将对象序列化到字符串$s中,然后释放对象,接着反序列化对象到$obj,你可以继续使用对象的方法!我不建议这样去做,因为(a)文档中没有保证这种行为在以后的版本中仍然可以使用。(b) 这个可能导致一种误解,在你把一个序列化后的版本保存到磁盘并退出脚本时。当以后运行这个脚本时,你不能期待着在反序列化一个对象时,对象的方法也会在那里,因为字符串表示根本就不包括方法。
总而言之,PHP 进行序列化对于保存对象的成员变量非常有用。(你也可以将相关数组和数组序列化到一个文件中)。
例子 : $obj=newClassfoo();$str=serialize($obj);//保存$str到磁盘上$obj2=unserialize($str);//几个月以后//从磁盘中装入str你恢复了成员数据,但是不包括方法(根据文档所说)。这导致了只能通过类似于使用$obj2->x来存取成员变量(你没有别的方法!)的唯一办法,所以不要在家里试它。
有一些办法可以解决这个问题,我把它留着,因为对这篇简洁的文章来说,他们太不好。我会很高兴地欢迎在PHP的后续版本中有全序列化的特性。
使用类进行数据存储PHP和OOP一件非常好的事情就是,你可以很容易地定义一个类来操作某件事情,并且无论何时你想用的时候都可以调用相应的类。假设你有一个HTML表单,用户可以通过选择产品ID号来选择一个产品。在数据库中有产品的信息,你想把产品显示出来,显示它的价格等等。你拥有不同类型的产品,并且同一个动作可能对不同的产品具有不同的意思。例如,显示一个声音可能意味着播放它,但是对于其它种类的产品可能意味着显示一个存在数据库中的图片。你可以使用OOP或PHP来减少编码并提高质量:
定义一个产品的类,定义它应该有的方法(例如:显示),然后定义对每一种类型的产品的类,从产品类派后出来(SoundItem类,ViewableItem类,等等),覆盖在产品类中的方法,使它们按你的想法动作。
根据数据库中每一种产品的类型(type)字段给类命名,一个典型的产品表可能有(id,type,price,description,等等字段)...然后在处理脚本中,你可以从数据库中取出type值,然后实例化一个名为type的对象: $obj=new$type();$obj->action();这是PHP的一个非常好的特性,你可以不用考虑对象的类型,调用$obj的显示方法或其它的方法。使用这个技术,你不需要修改脚本去增加一个新类型的对象,只是增加一个处理它的类。
这个功能很强大,只要定义方法,而不去考虑所有对象的类型,在不同的类中按不同的方法实现它们,然后在主脚本中对任意对象使用它们,没有if...else,也不需要两个程序员,只有高兴。
你同意编程是容易的,维护是便宜的,可重用是真的吗?
如果你管理一组程序员,分配工作就是很简单的了,每个人可能负责一个类型的对象和处理它的类。
可以通过这个技术实现国际化,根据用户所选的语言字段应用相应的类就可以了,等等。
拷贝和克隆
当你创建一个$obj的对象时,你可以通过$obj2=$obj来拷贝对象,新的对象是$obj的一个拷贝(不是一个引用),所以它具有$obj在当时的状态。有时候,你不想这样,你只是想生成一个象obj类一样的一个新的对象,可以通过使用new语句来调用类的构造函数。在PHP中也可以通过序列化,和一个基类来实现,但所有的其它类都要从基类派生出来。
进入危险区域
当你序列化一个对象,你会得到某种格式的字符串,如果你感兴趣,你可以调究它,其中,字符串中有类的名字(太好了!),你可以把它取出来,象: $herring=serialize($obj);$vec=explode(':',$herring);//以:为标识符把字符串拆分成一个数组$nam=str_replace(,'',$vec[2]);所以假设你创建了一个Universe的类,并且强制所有的类都必须从universe扩展,你可以在universe 中定义一个clone的方法,如下: classUniverse{//在新的PHP版本中克隆(__clone())是一个魔术方法,不要和这个方法搞混了functionclone(){$herring=serialize($this);$vec=explode(':',$herring);$nam=str_replace(,'',$vec[2]);$ret=new$nam;return$ret;}}//然后$obj=newSomething();//从Universe扩展$other=$obj->clone();你所得到的是一个新的Something类的对象,它同使用new方法,调用构造函数创建出的对象一样。我不知道这个对你是否有用,但是Universe类可以知道派生类的名字是一个好的经验。想象是唯一的限制。
模板引擎 Smarty:Smarty的特点是将模板编译成PHP脚本,然后执行这些脚本。很快,非常方便。 Heyes Template Class:一个非常容易使用,但功能强大并且快速的模板引擎,它帮助你把页面布局和设计从代码中分离。 FastTemplate:一个简单的变量插值模板类,它分析你的模板,把变量的值从HTML代码中分离处理。 ShellPage:一个简单易用的类,可以让你的整个网站布局基于模板文件,修改模板就能改变整个站点。 STP Simple Template Parser:一个简单、轻量级并且易于使用的模板分析类。它可以从多个模板中组装一个页面,把结果页面输出到浏览器或者文件系统。 OO Template Class:一个你可以用在自己程序中的面向对象的模板类。 SimpleTemplate:一个可以创建和结构化网站的模板引擎。它可以解析和编译模板。 bTemplate:短小但是快速的模板类,允许你把PHP逻辑代码从HTML修饰代码中分离。 Savant:一个强大且轻量级的PEAR兼容模板系统。它是非编译型的,使用PHP语言本身做为它的模板语言。 ETS - easy template system:可以使用完全相同数据重组模板的模板系统。 EasyTemplatePHP:适用于你的站点的一个简单但是强大的模板系统。 vlibTemplate:一个快速、全能的模板系统,它包含一个缓存和调试类。 AvanTemplate:多字节安全的模板引擎,占用很少系统资源。它支持变量替换,内容块可以设置显示或隐藏 Grafx Software’s Fast Template:一个修改版本的Fast Template系统,它包括缓存功能,调试控制台以及沉默去除为赋值块。 TemplatePower:一个快速、简单、功能强大的模板类。主要功能有嵌套的动态块支持,块/文件包含支持以及显示/隐藏未赋值的变量。 TagTemplate:这个库的功能被设计来使用模板文件,同时允许你从HTML文件检索信息。 htmltmpl: templating engine:一个适用于Python和PHP的模板引擎。它面向希望在项目中分离代码和设计的web应用开发人员。 PHP Class for Parsing Dreamweaver templates:一个分析Dreamweaver模板的简单类,被用于Gallery 2 和WordPress的自定义模块中。 MiniTemplator (Template Engine):针对HTML文件的一个紧凑型模板引擎。对于模板变量和块定义它具有简单的语法。其中块可以嵌套。 Layout Solution:简化网站开发和维护。它拥有常用的变量和页面元素使你不需要重复做页面布局工作。 Cached Fast Template:它已经纳入 FastTemplate ,允许你缓存模板文件,甚至可以在分离的块内容上缓存不同的规格。 TinyButStrong:一个支持MySQL,Odbc,Sql-Server和ADODB的模板引擎。它包含7个方法和两个属性。 Brian Lozier’s php based template engine:只有2K大小,非常快并且是面向对象设计。 WACT:一个从设计中分离代码的模板引擎。 PHPTAL:一个PHP下面的XML/XHTML模板库。 Rong_View_Wudimei:Wudimei开发的国产框架Rong Framework的模板引擎,它类似于smarty,优点是速度快,缺点是模板标签较少,不过够用了。 框架介绍thinkphp
ThinkPHP是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。
PHP认证级别
PHP课程由初级(IFE)、中级(IPE)和高级(IAE)三个部分。 IFE即Index Front-end Engineer的缩写,指数前端工程师的意思。 IPE即 Index PHP Engineer 的缩写,意思是指数PHP工程师。 IAE即 Index architecture/advanced engineer 的缩写,意思是:指数高级/架构工程师。 PHP安全
PHP其实不过是Web服务器的一个模块功能,所以首先要保证Web服务器的安全。当然Web服务器要安全又必须是先保证系统安全,这样就扯远了,无穷无尽。常见的web安全漏洞有:注入攻击,跨站攻击,服务器自身漏洞等,对应的详细解释,详见:扩展阅读中的《WEB安全性-2010_OWASP_TOP10》,这里有很详尽的解释。
PHP的优点学习过程和方法
PHP的语法类似于C,Perl,ASP或者JSP。对于那些对上述之一的语言较熟悉的人来说,PHP太简单了。相反的,如果你对PHP了解较多,那么你对于其他几种语言的学习都很简单了。你只需要很短的时间内将PHP的核心语言特点全部掌握,你可能已经非常了解HTML,甚至你已经知道怎样用编辑设计软件或者手工来制作好看的WEB站点。由于PHP代码能够无障碍的添加进你的站点,在你设计和维护站点的同时,你可以很轻松的加入PHP使得你的站点更加具有动态特性。
数据库连接
PHP可以编译成具有与许多数据库相连接的函数。PHP与MySQL是绝佳的组合,如果再加上Apache服务器,就是相当完美的了。你还可以自己编写外围的函数取间接存取数据库。通过这样的途径当你更换使用的数据库时,可以轻松的更改编码以适应这样的变化。PHPLIB就是最常用的可以提供一般事务需要的一系列基库。
可扩展性
就像前面说的那样,PHP已经进入了一个高速发展的时期。对于一个非程序员来说为PHP扩展附加功能可能会比较难,但是对于一个PHP程序员来说并不困难。
PHP可伸缩性
传统上网页的交互作用是通过CGI来实现的。CGI程序的伸缩性不很理想,因为它为每一个正在运行的CGI程序开一个独立进程。解决方法就是将经常用来编写CGI程序的语言的解释器编译进你的web服务器(比如mod_perl,JSP)。PHP就可以以这种方式安装,虽然很少有人愿意这样以CGI方式安装它。内嵌的PHP可以具有更高的可伸缩性。
PHP免费安装
PHP源代码包安装版:这个版本适合已经有自己独立的网站域名、网站空间的专业网站建设用户。使用方法依然其为简单,只需三步:
第一、到官方网站:下载 PHP源代码包安装版最新版本,解压下载文件,将其中的全部内容上传到你的支持PHP的网站空间
第二、改更文件属性,请将根目录下以PHP为后缀名的文件和”/include/domain.php”和 “/attachments” 和 “/data”文件夹以及文件夹下所有的文件属性改成“可读”、“可写”、“可执行”,通常是“755”。
第三、打开你的网站根目录,系统会自动运行setup安装程序,按提示点下一步操作即可。
友情提示:当你下载我们的软件并看到这份说明时,则说明你一定是对企业网站建设有一定的需求或者你是一个网站建设技术学习者。
文件格式 对于只含有 php 代码的文件,我们将在文件结尾处忽略掉 ?>。这是为了防止多余的空格或者其它字符影响到代码。 例如:
$foo = 'foo'; 缩进应该能够反映出代码的逻辑结果,尽量使用四个空格,禁止使用制表符TAB,因为这样能够保证有跨客户端编程器软件的灵活性。 例如: if(1==$x){$indented_code=1;if(1==$new_line){$more_indented_code=1;}}变量赋值建议保持相等间距和排列。 例如: $variable='demo';$var='demo2';每行代码长度应控制在80个字符以内,最长不超过120个字符。因为 linux 读入文件一般以80列为单位,就是说如果一行代码超过80个字符,那么系统将为此付出额外操作指令。这个虽然看起来是小问题,但是对于追求完美的程序员来说也是值得注意并遵守的规范。 每行结尾不允许有多余的空格。 Php文件记事本编辑乱码问题
一般情况下,记事本编辑器在对文件进行完编辑并保存之时,其默认编码为ANSI,中文。然则更多的时候,php在语言环境设置时语言多数为utf-8,直接保存并用于apache等http-server解析后就会出现乱码。
为此,应该注意在用记事本编辑完后可将文件用“另存为”的方式对文件进行保存,并将“文件类型”选择“所有文件”,编码与文件指定语言编码一致即可。
算数运算符
PHP 的运算符包括算术运算符、赋值运算符、比较运算符和逻辑运算符。
算数运算符:
加,减,乘,除,取模(取余)+、-、*、/、%
赋值运算符:(以下解释在许多书中有所不同)
赋值,加赋值,减赋值、乘赋值、除赋值,连字赋值
=、+=、-=、*=、/=、.=
位运算符:
位与、位或、位亦或、位非、左移、右移
&、|、^、~、<<、>>
比较运算符:
等于、全等于、不等于、不全等于、大于、小于、大于等于、小于等于
==、===、!=(<>)、!==、>、<、>=、<=
逻辑运算符:
逻辑与、逻辑或、逻辑非、逻辑亦或
&&、||、!、xor
字符串运算符:
. 连接两个字符串
‘柒’ 说说php面向对象编程时static,public,private,protected 各有什么意义
staticpublic与publicstatic是等价的,这两者只是两个修饰符的顺序不同。根据oracle.com教材中第八章的描述,如果两个或两个以上的(不同的)字段修饰符出现在字段声明,它们出现的顺序需与FieldModifier一致,这只是习惯,但不是必需的。部分修饰符说明:public是访问权限修饰符,用于控制外界对类内部成员的访问,声明为public的对象成员是完全共有的,外界可以随意访问,除此之外还有private,protected和默认。static控制类成员变化的修饰符。static是静态成员修饰符,其修饰的静态变量脱离具体对象独立存在,在内存中之后一份拷贝,所有的对象都公用这一个存储空间,所以对static修饰的静态变量进行的修改对该类的所有对象都起作用。static修饰的静态函数代表所有对象的统一操作,只能调用静态变量。static是针对面向对象中的“多态”而提出来的,static修饰的静态成员不存在多态性。附:FieldModifier顺序