PHP语言是同时可以应用面向过程和面向对象方式的编程,面向过程与面向对象在许多编程语言中只能使用二者之一来进行编程,但是PHP语言与其他编程语言有不同之处,那就是我们可以自由的选择或者将PHP面向过程和面向对象二者混用。
面向过程编程采取的是时间换空间的策略,因为在早期计算机配置低,内存小,如何节省内存则成了首要任务,哪怕是运行的时间更长。
随着硬件技术的发展,硬件不再成为瓶颈,相反更好的模拟现实世界,系统的可维护性等问题凸显出来,于是面向对象设计应运而生。
当下:应用在PC机上的一般应用系统,由于不太需要考虑硬件的限制,而系统的可维护性等方面却要求很高,一般采用面向对象方式;
而在内存限制有所要求的嵌入式系统,则大多采用面向过程方式进行设计编程。
面向过程程序设计:(procedure oriented programming 简称POP)
是一种以过程为中心的编程思想,就是分析出解决问题所需要的步骤,然后用变量和函数把这些步骤一步一步实现,使用的时候一个一个一次调用就可以了。
举个php连接数据库的例子:
$conn = mysql_connect('服务器名称', '数据库登录名', '密码') or die('连接不成功!');
mysql_select_db('库名', $conn) or dir ('数据库不存在!');
$queryid = mysql_query("select * from sort");while($rs = mysql_fetch_assoc($queryid)){
echo $rs['name'];}
面象对象程序设计:object oriented programming 简称 OOP,
是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。它可能包含数据,属性,代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性,灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据
面向对象三大基本特性,五大基本原则。
透彻理解面向对象三大基本特性是理解面向对象五大基本原则的基础。
三大特性:封装,继承,多态
封装:
就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。
在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
继承:
指可以让某个类型的对象获得另一个类型的对象的属性和方法。它支持按级分类的概念。
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”,“父类”或“超类”。
继承的过程,就是从一般到特殊的过程。继承概念的实现方式有二类:实现继承和接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称,但是子类必须提供实现的能力。
多态:
是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
五大基本原则:
一。单一职责原则SRP(Single Responsibility Principle)
是指一个类的功能要单一,不能保罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。
二。开放封闭原则OCP(Open-Close Principle)
一个模块在扩展性方面应该是开放的,而在更改性方面应该是封闭的。
比如:一个网络模块,原来子只服务端功能,而现在要加入客户端功能,那么应当在不用修改服务器端功能代码的前提下,就能够增加客户端功能的实现代码,这就要求在设计之初,就应当将服务器端和客户端分开,公共部分抽象出来。
三。里式替换原则LSP(The Liskov Substitution Principle LSP)
子类应当可以替换父类并出行在父类能鼓出现的任何地方。
比如:公司搞年度晚会,所有员工都都可以参加抽奖,那么不管是老员工还是新员工,也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。
四。依赖倒置原则DIP(the Dependency Inversion Principle DIP)
具体依赖抽象,上层依赖下层。
假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类;而应当由B定义一抽象接口,并由A来实现这个抽象接口。B只使用这个抽象接口;这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。
通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的文件,而编译B时同样要直接包含A的文件。
五。接口分离原则 ISP(the Interface Segregation Principle ISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。
总结
PHP开发者可以在面向过程和面向对象二者中自由选择其一或是混合使用,不过由于在 PHP5 之前的版本中,PHP 主要还是面向过程的编程语言,因此大多时候 PHP 开发者应该还是选择面向过程的方式进行开发。
一个PHP开发者完全不使用面向对象,他也能开发出很出色的 PHP 程序,我们可以想象,Web 页面的解析本身就很过程化了,在 HTML 中嵌入面向过程处理的代码是非常自然的手段。
面向过程开发周期短,发布快,效率较高。
面向对象开发周期长,效率较低但易于维护,改进,扩展和开发 API。
显然易见,我们很难说哪一个方式会更优秀,与其争论哪一种编程方式更优秀,不如尽量发挥出两种编程方式各自的优势。
因此不能说面向对象是一种比面向过程更加优秀的编程方式,只是另一种编程选择。