面向对象的程序设计思路是现代程序设计由面向过程演变面向对象的必然趋势,所以面向对象的而设计思路必然有它不同的时代意义,必然有着不同面向过程的不同历史使命,而php 5以后成功添加面向对象的设计思路其实是必然的过程。面向对象的设计主要思路就是将程序和数据封装在一个叫对象的基本单位之中来提高重用性,灵活性和可扩展性。他同面向过程和函数式编程的设计思路一样是编程语言的一种范式,是一种规范编程程序的设计方法。只是各自承担着不同的规范职责而已。
对象是基本单位,对象的封装需要类来实现,这才能将对象一个个区别开来。对象和类的共同存在的,对象没有类就像一个家庭没有人一样没有意义,而类没有对象也就像一个孩子没有家一样无法存活。
php的面向对象其实并不会像java或者c++那样完美展现面向对象的特质,面向对象其实只是php的一个可支持的设计思路,php其实是一种提倡面向过程的的语言,很久以来面向对象的思路不被php程序员接受的,很多人对面向对象的思路表式明显的排斥,这是面向对象在php不能够完美的体现的主要原因。
下面具体讲讲php面向对象的具体实现,
1.类的申明
同样由class为类的关键字,申明类中需要定义变量,定义一个构造函数,php的构造函数的定义不同于其他的语言,统一用一个自带的神奇函数_construct()来对其函数进行初始化工作。当然也可以定义与之对应的析构函数_destruct(),用于销毁对象,释放函数。在类的申明中当需要其他方法,需要在此定义。
2.类的实例化
将申明好的类new创建一个新对象,在内存中分配一个空间给这个类,给这个类去一个新的名字,就这样这个对象才可以真的的而被使用。
3.使用对象
就像函数的调用一样,在对象需要的使用对象就可以了,就是对实例化的对象和对象中的属性或者方法利用对象运算符(->)连接,这样就可以和函数一样就行相应的调用。
php的对象实现和其他面向对象语言没有太大的差异,php中有一些内置的神奇方法,如构造函数_construct()和析构函数_destruct();他们具有特殊意义或功能的方法,无需定义。具有各自特定的功能。常以"_"开头。
常见的神奇方法:
1._autoload() 自动加载方法,不用知道申明类的文件在哪里,只需要知道文件名,就可以自动加载该文件。这个方法在结构复杂的项目中有着很明显作用
1 function _autoload($classname){ 2 include strtolower($classname).'.php'; 3 }
2._set()和_get() 前者用于对象属性值的设置,后者是用于对象属性取值。
1 public function _set($name,$value){ 2 echo "setting $name to $value \r\n"; 3 $this->$name=$value; 4 } 5 public function _get($name){ 6 if(!isset($this->$name)) 7 { 8 echo "未设置";
9 $this->$name="正在为你设置默认值";10 } 11 return $this->$name; 12 }
3._call()和_callStatic() 前者是为防止调用不可访问的方法出错。当调用一个不可访问的方法时这个方法自动被调用。其原型为:mixed_call(string $name,array $argumets) 其中$name是要调用的方法名,$argumets是包含要传递的所有参数的一个数组。
public function _call($name,$arguments) { switch(count($arguments) { case 2: echo "$arguments[0]*$arguments[1].PHP_EOL; break; case 3: echo array_sum($arguments).PHP_EOL; break; default: echo '参数不对'.PHP_EOL; break; } }
面向对象中的继承,组合和多态都是解决程序重复的重要方法,具有公共代码重用性。下面就谈谈php类的重用
1.继承和组合
这是两个很容易混淆的概念,他们具有很大的相似之处,两者都是提高代码的可重用性,只是两者的设计思路不是不一样的,类与类之间的关系是不同的,继承是父与子的关系,而组合是一种需要,整体和局部的关系。就像是父亲和家庭的关系。有时候两种对象之间既可以建立继承关系又可以建立组合关系。这时候我们是更倾向于使用组合。因为继承有以下几个问题:
1.继承破坏了封装性,对象的封装本来就是为了使对象之间相互独立,各自封装起来。子类继承父类所有属性和方法,但是有时子类并不是继承父类所有的属性和方法的。比如父类是鸟类,有飞翔的属性,但是子类燕子和鸵鸟都继承了父类的飞行,但是鸵鸟是不具有飞的能力,但是他可以和燕子一样,这样无法区别两个子类,这就不符合类的封装性。但是组合就很好解决这个问题,鸵鸟并没有父类的飞的属性。
2.继承是紧耦合的, 继承使子类和父类捆绑在一起,但是组合仅仅通过唯一接口和外部进行通信。
3.继承扩展复杂,随着继承层数增加和子类增加。将涉及大量方法重写,使用组合可以根据类型约束实现动态组合,减少代码。
2.多态
顾名思义多态就是多种状态,多种结果。在php中多态常见于一个父类有两个不同子类。可以通过父类的不同对象调用不同的子类方法。这就是同一类型,不同结果。
php面向对象还具有接口,反射两种表现形式,但由于本人对这两个不是很了解,就不在此断章取义了。以后再研究。
总之,php不是一个很好的面向对象的语言,但是随着php的应用越来越广,我相信面向对象在php中回事越来越重要。