PHP5多态性与动态绑定介绍
什么是多态性?
多态性是继数据抽象和继承后,面向对象语言的第三个特征。从字面上理解,多态的意思是“多种形态”,简单来说,多态是具有表现多种形态的能力的特征,在OO中是指“语言具有根据对象的类型以不同方式处理之,特别是重载方法和继承类这种形式”的能力。多态被认为是面向对象语言的必备特性。
例如:
我们创建一个接口Shape,定义一个空的方法draw(),那么所有的实现类都必须实现这个方法,假设Shape有两个实现类:Triangle和Rectangle,我们虽然无法通过类似这样的Java代码来诠释PHP的多态性:
Shapes=newTriangle(); s.draw();
不过PHP5.1中引入了TypeHinting,可以限制函数(或者方法)的参数类型,我们使用这个特性来演示PHP5的多态性。
参考如下的代码:
classTestPolymorphism{ publicfunctiondrawNow(Shape$shape){ $shape->draw(); } }
函数drawNow()中限制传入的参数类型必须为Shape接口派生类的对象,这里我们传递给drawNow()的参数可能是Triangle或者Rectangle的对象,也可能是其它的Shape接口的派生类对象,比如Circle等等,简单的说drawNow()的参数类型是无法预知的,$shape->draw()的行为最终由传入的参数的具体类型来决定,比如如果传入Triangle的对象,那么就调用Triangle的draw()方法,如果传入Rectangle的对象,就调用Rectangle的draw()方法。这种在运行时刻根据传递的对象参数的类型来决定调用哪一个对象的方法的行为就可以称之为多态。
Shape也可以是一个抽象基类或者是非抽象的基类,上面的论述都是成立的。区别在于接口仅定义一套实现类必须遵守的规则,而使用基类则可以为派生类提供一些缺省的行为。
参考代码如下:
/** *ShapeInterface * *@version1.0 *@copyright */ interfaceShape{ publicfunctiondraw(); } /** *Triangle * *@usesShape *@version1.0 *@copyright */ classTriangleimplementsShape{ publicfunctiondraw(){ print"Triangle::draw()\n"; } } /** *Rectangle * *@usesShape *@version1.0 *@copyright */ classRectangleimplementsShape{ publicfunctiondraw(){ print"Rectangle::draw()\n"; } } /** *TestPolymorphism * *@version1.0 *@copyright */ classTestPoly{ publicfunctiondrawNow(Shape$shape){ $shape->draw(); } } $test=newTestPoly(); $test->drawNow(newTriangle()); $test->drawNow(newRectangle()); /*vim:setexpandtabtabstop=4shiftwidth=4:*/
什么是动态绑定?
HaoHappy翻译的PHP5ObjectPattern第九节中有介绍:
除了限制访问,访问方式也决定哪个方法将被子类调用或哪个属性将被子类访问。函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定。
另有的说法:
绑定(binding):将方法的调用连到方法本身被称为绑定,当绑定发生在编译期,被称做静态绑定,而在程序运行的时候根据对象的类型来决定该绑定方法的成为动态绑定。
PHP是一种动态语言,使用动态绑定。无须考虑采取何种绑定策略,因为一起都是自动的。