澳门威斯尼人平台登陆PHP面向对象编程快速入门_php基础_脚本之家

by admin on 2019年11月26日

澳门威斯尼人平台登陆,与大多数可以面向对象的编程语言不一样, PHP
是同时支持面向过程和面向对象的编程方式, PHP
开发者可以在面向过程和面向对象二者中自由选择其一或是混合使用,不过由于在
PHP5 之前的版本中, PHP 主要还是面向过程的编程语言,因此大多时候 PHP
开发者应该还是选择面向过程的方式进行开发,事实上, Kayo 认为即使一个 PHP
开发者完全不使用面向对象,他也能开发出很出色的 PHP 程序,我们可以想象,
Web 页面的解析本身就很过程化,在 HTML
中嵌入面向过程处理的代码是非常自然的手段,因此不能说面向对象是一种比面向过程更加优秀的编程方式,只是另一种编程选择,当然这里说的是
PHP 中的情况。

面向对象编程的概念:
不同的作者之间说法可能不一样,但是一个OOP语言必须有以下几方面:
抽象数据类型和信息封装 继承 多态 在PHP中是通过类来完成封装的: x=$v; }
functiongetX(){ return$this->x; } }
当然你可以按自已的喜好进行定义,但最好保持一种标准,这样会更有效。数据成员在类中使用”var”声明来定义,在给数据成员赋值之前,它们是没有类型的。一个数据成员可以是一个整数,一个数组,一个相关数组或者是一个对象。方法在类中被定义成函数形式,在方法中访问类成员变量时,你应该使用$this->name,否则对一个方法来说,它只能是局部变量。
使用new操作符来创建一个对象: $obj=newSomething;
然后你可以使用成员函数通过: $obj->setX;
在这个例子中,setX成员函数将5赋值给对象的成员变量x,然后getX返回它的值5。可以象:$obj->x=6那样通过类引用方式来存取数据成员,这不是一个很好的OOP习惯。我强烈建议通过方法来存取成员变量。如果你把成员变量看成是不可处理的,并且只通过对象句柄来使用方法,你将是一个好的OOP程序员。不幸的是,PHP不支持声明私有成员变量,所以不良代码在PHP中也是允许的。继承在PHP中很容易实现,只要使用extend关键字。
y=$v; } functiongetY(){ return$this->y; } }
“Another”类的对象现在拥有了父类的全部的数据成员及方法,而且还加上了自已的数据成员和方法。
你可以使用 $obj2=newSomething; $obj2->setX;
PHP现在还不支持多重继承,所以你不能从两个或两个以上类派生出新的类来。你可以在派生类中重定义一个方法,如果我们在”Another”类中重定义了getX方法,我们就不能使用”Something”中的getX方法了。如果你在派生类中声明了一个与基派同名的数据成员,那么当你处理它时,它将“隐藏”基类的数据成员。
你可以在你的类中定义构造函数。构造函数是一个与类名同名的方法,当你创建一个类的对象时会被调用,例如:
x=$y; } functionsetX{ $this->x=$v; } functiongetX(){
return$this->x; } } 所以你可以创建一个对象,通过: $obj=newSomething;
构造函数会自动地把6赋值给数据变量x。构造函数和方法都是普通的PHP函数,所以你可以使用缺省参数。
functionSomething 接着: $obj=newSomething();//x=3andy=5
$obj=newSomething;//x=8andy=5 $obj=newSomething;//x=8andy=9
缺省参数使用C++的方式,所以你不能忽略Y的值,而给X一个缺省参数,参数是从左到右赋值的,如果传入的参数少于要求的参数时,其作的将使用缺省参数。
当一个派生类的对象被创建时,只有它的构造函数被调用,父类的构造函数没被调用,如果你想调用基类的构造函数,你必须要在派生类的构造函数中显示调用。可以这样做是因为在派生类中所有父类的方法都是可用的。
y=5; $this->Something(); //显示调用基类构造函数 }
OOP的一个很好的机制是使用抽象类。抽象类是不能实例化,只能提供给派生类一个接口。设计者通常使用抽象类来强迫程序员从基类派生,这样可以确保新的类包含一些期待的功能。在PHP中没有标准的方法,但是:如果你需要这个特性,可以通过定义基类,并在它的构造函数后加上”die”的调用,这样就可以保证基类是不可实例化的,现在在每一个方法后面加上”die”语句,所以,如果一个程序员在派生类中没有覆盖方法,将引发一个错误。而且因为PHP是无类型的,你可能需要确认一个对象是来自于你的基类的派生类,那么在基类中增加一个方法来实义类的身份,并且在你接收到一个对象参数时校验这个值。当然,如果一个邪恶不好的程序员在派生类中覆盖了这个方法,这种方法就不起作用了,不过一般问题多发现在懒惰的程序员身上,而不是邪恶的程序员。
当然,能够让基类对程序员无法看到是很好的,只要将接口打印出来做他们的工作就可以了。在PHP中没有析构函数。
重载在PHP中不支持。在OOP中,你可以重载一个方法来实现两个或重多的方法具有相同的名字,但是有不同数量或类型的参数。PHP是一种松散类型的语言,所以通过类型重载不起作用,然而通过参数的个数不同来重载也不起作用。
有时在OOP中重载构造函数非常好,这样你可以通过不同的方法创建对象。在PHP中实现它的技巧是:
name()一般是错误的,但是在这里$name是一个将被调用方法的名字 }
functionMyclass1{ code; } functionMyclass2{ code; } }
通过在类中的额外的处理,使用这个类对用户是透明的:
$obj1=newMyclass;//将调用Myclass1 $obj2=newMyclass;//将调用Myclass2
有时这个非常好用。 多态
多态是对象的一种能力,它可以在运行时刻根据传递的对象参数,决定调用哪一个对象的方法。例如,如果你有一个figure的类,它定义了一个draw的方法。并且派生了circle和rectangle类,在派生类中你覆盖了draw方法,你可能还有一个函数,它希望使用一个参数x,并且可以调用$x->draw()。如果你有多态性,调用哪个draw方法就依赖于你传递给这个函数的对象类型。

PHP是一种简单,实用的动态网页编程语言。目前最新版为5.01,其使用帮助内含最新UNIX和Windows安装文档,方便初学者使用!

面向对象编程是我们编程的一项基本技能,PHP4对OOP提供了良好的支持。如何使用OOP的思想来进行PHP的高级编程,对于提高PHP编程能力和规划好Web开发构架都是非常有意义的。下面我们就通过实例来说明使用PHP的OOP进行编程的实际意义和应用方法。
我们通常在做一个有数据库后台的网站的时候,都会考虑到程序需要适用于不同的应用环境。和其他编程语言有所不同的是,在PHP中,操作数据库的是一系列的具体功能函数。这样做虽然效率很高,但是封装却不够。如果有一个统一的数据库接口,那么我们就可以不对程序做任何修改而适用于多种数据库,从而使程序的移植性和跨平台能力都大大提高。
在PHP中要完成OOP,需要进行对象封装,也就是编写类。我们可以通过生成一个新的SQL类实现对数据库的简单封装。例如:Driver=new$d();//根据驱动名称生成相应的数据库驱动类returntrue;}}returnfalse;//注册驱动失败}functionConnect($host,$user,$passwd,$database)//连接数据库的函数{$this->Driver->host=$host;$this->Driver->user=$user;$this->Driver->passwd=$passwd;$this->Driver->database=$database;$this->connection=$this->Driver->Connect//关闭数据库函数{$this->Driver->close;}functionQuery//数据库字符串查询函数{return$this->Driver->query($queryStr,$this->connection);}functiongetRows//查找行{return$this->Driver->getRows;}functiongetRowsNum//取得行号{return$this->Driver->getRowsNum;}}?>
我们以操作MySQL数据库为例。我们写一个数据库驱动类MySQL,在该类中,我们把有关MySQL数据库操作的函数都做进一步的封装。把包含该类,文件名为MySQL.php的文件放在PHP的系统include_path下,就可以正常地使用了。注意编写数据库驱动文件时,文件名应和类名保持一致。host,$this->user,$this->passwd)ordie(“Couldnotconnectto$this->host”);MySQL_select_db($this->database,$conn)ordie(“Couldnotswitchtodatabase$this->database;”);return$conn;}functionClose{MySQL_close;}functionQuery{$res=MySQL_queryordie(“Couldnotquerydatabase”);return$res;}functiongetRows{$rowno=0;$rowno=MySQL_num_rows{for($row=0;$row
同样我们要封装其他的“数据库驱动”到我们的SQL类中,只需要建立相应的类,并以同名命名驱动文件,放到PHP的include目录就可以了。
完成封装以后,就可以在PHP中按照OOP的思想来实现对数据库的编程了。<
?Include;$sql=newSQL;//生成新的Sql对象if($sql->DriverRegister//注册数据库驱动{$sql->Connect(“localhost”,”root”,””,”test”);$res=$sql->query;//返回查询记录集$rowsnum=$sql->getRowsNum{$rows=$sql->getRows;foreach//循环取出记录集内容{foreach{print$field;}}}$sql->Close();}?
>
在实际应用中,我们还可以根据实际需求对各种对象类做进一步扩展。在PHP中,还提供了一系列复杂的OOP方法,例如继承,重载,引用,串行化等等。充分调动各种方法并灵活运用,就能够使你的网站更合理和结构化,开发和维护也更容易。

作者:Leon Atkinson
翻译:Haohappy面向对象编程被设计来为大型软件项目提供解决方案,尤其是多人合作的项目.
当源代码增长到一万行甚至更多的时候,每一个更动都可能导致不希望的副作用.
这种情况发生于模块间结成秘密联盟的时候,就像第一次世界大战前的欧洲.//haohappy注:喻指模块间的关联度过高,相互依赖性太强.更动一个模块导致其它模块也必须跟着更动.想像一下,如果有一个用来处理登录的模块允许一个信用卡处理模块来分享它的数据库连接.
当然出发点是好的,节省了进行另一个数据库连接的支出.然而有时,登录处理模块改变了其中一个变量的名字,就可能割断了两者间的协议.导致信用卡模块的处理出错,进而导致处理发票的模块出错.
很快地,体系中所有无关的模块都可能由此出错.因此,我觉得有点戏剧性地,绝大多数程序员都对耦合和封装心存感激.
耦合是两个模块间依赖程度的量度.
耦合越少越好.我们希望能够从已有的项目中抽走一个模块并在另一个新项目中使用.
我们也希望在某个模块内部大规模的更动而不用担心对其他模块的影响.
封装的原则可以提供这个解决方案.模块被看待成相对独立,并且模块间的数据通信通过接口来进行.
模块不通过彼此的变量名来窥探另一个模块,它们通过函数来礼貌地发送请求.封装是你可以在任何编程语言中使用的一个原则.
在PHP和许多面向过程的语言中,可以偷懒是很有诱惑的.没有什么可以阻止你通过模块来构建一个假想的WEB.
面向对象编程是使程序员不会违背封装原则的一种方法.在面向对象编程中,模块被组织成一个个对象.
这些对象拥有方法和属性.
从抽象的角度来看,方法是一个对象的所做的动作,而属性是对象的特性.从编程角度来看,方法就是函数而属性是变量.
在一个理想化的面向对象体系中,每个部份都是一个对象.
体系由对象及对象间通过方法来形成的联系构成.一个类定义了对象的属性.
如果你在烘烤一组甜饼对象,那么类将会是甜饼机.
类的属性和方法是被调用的成员.
人们可以通过说出数据成员或者方法成员来表达.每种语言提供了不同的途径来访问对象.
PHP从C++中借用概念,提供一个数据类型用来在一个标识符下包含函数和变量。最初设计PHP的时候,甚至PHP3被开发出时,PHP并不打算提供开发超过10万行代码的大型项目的能力。随着PHP和Zend引擎的发展,开发大型项目变得有可能,但无论你的项目规模多大,用类来书写你的脚本将可以让代码实现重用。这是一个好主意,特别当你愿意与别人分享你的代码的时候。有关对象的想法是计算机科学上最令人兴奋的概念之一。开始很难掌握它,但我可以保证,一旦你掌握了它,用它的思维来思考将会非常自然。

对于 PHP
中面向过程和面向对象各自的优缺点,相信在网上稍查一下就会很清楚了,面向过程开发周期短,发布快,效率较高,面向对象开发周期长,效率较低但易于维护,改进,扩展和开发
API
。显然易见,我们很难说哪一个方式会更优秀,与其争论哪一种编程方式更优秀,不如尽量发挥出两种编程方式各自的优势。

最新版的更新文档列出了众多更新特性,修正的bug。同4.XX一系列的版片相比,它主要的优点就是真正支持面向对象编程。然而,5.01不同于以前4.XX版的开发水平,要成为主流动态网页开发工具还需一段时间。

回到 PHP
的面向对象编程,在使用面向对象的过程中还是很容易就感受到它的优势,最明显的地方是代码功能更加清晰,数据处理,用户登陆,内容呈现等各写成一个类,在页面中只需包含这些类、实例化对象,然后再用简洁的语句应用对象就行,这与面向过程中把数据处理,用户登陆,还有内容等部分写在一起相比,前者的编程思路肯定更加清晰和易于理解,相信团队开发中应该更为偏向于面向对象编程。

PHP 5.01新特性

下面举一个简单的例子说明一下面向过程和面向对象两种方式各自的优缺点

—改变析构机制,以便更好优先调用或请求关闭。
—重写UNIX和Windows安装帮助文件。
—更新几个微软发布的库,包含libxml2-2.6.11, libxslt-1.1.7 and
iconv-1.9.1。 —改善动态脚本SAPI并移植到PECL。 —修正动态加载扩展的卸载。
—修正其他33个bug。

在处理表单或接受 url 参数时,为了防止 SQL 注入等问题, PHP
开发者常常需要过滤字符串。

[点击这里下载]

在面向过程的方式中,我们会在需要过滤字符串的语句中调用各种过滤字符串的库函数或自定义函数,这样下来,页面中就会出现很多不同的过滤函数甚至还有复杂的正则表达式,即使在页面中写了足够的注释难免还是比较混乱,下面看看面向对象的处理方式。

首先是定义了一个简单的处理字符串的类,把各种复杂的字符串处理写成方法(关于
PHP 面向对象的知识可以 Google ,本文不另外叙述。)

length = $the_length; } // 转义 SQL 语句中使用的字符串中的特殊字符 function realEscapeString{ return mysql_real_escape_string; } // 正则限制字符串内只能为数字 function eregNumber{ if( ereg("^[0-9]+$",$the_string) ) return true; else return false; } // 判断字符串是否为空 function strlenString{ return strlen; } // 判断字符串长度 function ifOverStrlenLength{ if > $this->length ) return true; else return false; } } ?>

然后在需要过滤字符串的页面中实例化该类

$string = new StringFiltration(); 

接着在过滤或判断字符串时调用类中定义好的方法,于是页面中会出现一些调用方法的语句。

$email = $string->realEscapeString;$postId = $string->eregNumber;

在上面的例子中,我们可以看到,在面向对象处理字符串之前,我们必须定义一个类,然后再在需要的页面中实例化这个类并调用这个类中的方法,这里看来,面向对象的效率相比面向过程是低了,而且也很麻烦,不过这样的优势也很明显,实际处理或判断字符串的语句都写在类的内部,在调用方法的页面并不会出现各种复杂的自定义函数和诸如正则表达式这样复杂的语句,页面的结构乃至整个网站的结构更加清晰了,并且在写好一个类后,日后进行
PHP 开发时都可以再使用这个类,从长远来看效率反而高了。因此一直都在进行
PHP 面向过程编程的开发者不妨换种思路,试试面向对象。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图