PHP5多态性与动态绑定方法

PHP5多态性与动态绑定方法
    多态性是继数据抽象和继承后,面向对象语言的第三个特征。从字面上理解,多态的意思是“多种形态”,简单来说,多态是具有表现多种形态的能力的特征,在OO中是指“语言具有根据对象的类型以不同方式处理之,特别是重载方法和继承类这种形式”的能力。多态被认为是面向对象语言的必备特性。

例如:

创建一个接口 Shape,定义一个空的方法 draw(),那么所有的实现类都必须实现这个方法,假设 Shape 有两个实现类:Triangle 和
Rectangle,我们虽然无法通过类似这样的 Java 代码来诠释 PHP 的多态性:

Shape s = new
Triangle();

s.draw();

class TestPolymorphism {

public
function drawNow(Shape $shape) {
        $shape->draw();
   
}
}//codego.net

函数 drawNow() 中限制传入的参数类型必须为 Shape 接口派生类的对象,这里我们传递给 drawNow()
的参数可能是 Triangle 或者 Rectangle 的对象,也可能是其它的 Shape 接口的派生类对象,比如 Circle 等等,简单的说
drawNow() 的参数类型是无法预知的,$shape->draw() 的行为最终由传入的参数的具体类型来决定,比如如果传入 Triangle
的对象,那么就调用 Triangle 的 draw() 方法,如果传入 Rectangle 的对象,就调用 Rectangle 的 draw()
方法。这种在运行时刻根据传递的对象参数的类型来决定调用哪一个对象的方法的行为就可以称之为多态。

Shape
也可以是一个抽象基类或者是非抽象的基类,上面的论述都是成立的。区别在于接口仅定义一套实现类必须遵守的规则,而使用基类则可以为派生类提供一些缺省的行为。

/**
 * Shape Interface
 *
 *
@version 1.0
 * @copyright
 */
interface Shape {
    public
function draw();
}
 
/**
 * Triangle
 *
 * @uses Shape
 *
@version 1.0
 * @copyright
 */
class Triangle implements Shape {

public function draw() {
        print "Triangle::draw()\n";
   
}
}
 
/**
 * Rectangle
 *
 * @uses Shape
 * @version
1.0
 * @copyright
 */
class Rectangle implements Shape {
    public
function draw() {
        print "Rectangle::draw()\n";
   
}
}
 
/**
 * Test Polymorphism
 *
 * @version 1.0
 *
@copyright
 */
class TestPoly {
    public function drawNow(Shape
$shape) {
        $shape->draw();
    }
}
 
 
$test = new
TestPoly();
$test->drawNow(new Triangle());
$test->drawNow(new
Rectangle());
 
/* vim: set expandtab tabstop=4 shiftwidth=4: */

什么是动态绑定?

HaoHappy 翻译的 PHP5 Object Pattern 第九节中有介绍:

除了限制访问,访问方式也决定哪个方法将被子类调用或哪个属性将被子类访问。 函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定。

时间: 2024-10-29 16:28:27

PHP5多态性与动态绑定方法的相关文章

多态性的基本方法

一.运行期类型与编译期类型 1.第一种情况:编译期类型和运行期类型相同: 声明A的时候,使用到的类型A表示对象的类型,被称为编译期类型,在编译期,虚拟机认为a的类型是A,对于a所使用的属性和方法的有效性将到类A中去验证. 构造方法A()中的A是运行期类型,在运行期,将执行运行期类型中的方法 2.第二种情况:当有继承关系时,可能发生编译期类型和运行期类型不同的情况,即编译期类型是父类类型,运行期类型是子类类型. 对象ab的编译期类型为父类A类,运行期类型为子类B类. 如果一个引用的编译期类型和运行

python基础之多态与多态性、绑定方法和非绑定方法

多态与多态性 多态 多态并不是一个新的知识 多态是指一类事物有多种形态,在类里就是指一个抽象类有多个子类,因而多态的概念依赖于继承 举个栗子:动物有多种形态,人.狗.猫.猪等,python的序列数据类型有字符串.列表.元组,文件的类型分为普通文件和可执行文件,人类又有多种形态,男女老少..等等例子 1 import abc 2 class Animal(metaclass=abc.ABCMeta): #模拟动物类 3 @abc.abstractmethod 4 def talk(self): 5

python中函数和方法区别,以及如何给python类动态绑定方法和属性(涉及types.MethodType()和__slots__)

网上有很多同义但不同方式的说法,下面的这个说法比较让你容易理解和接受 1 与类和实例无绑定关系的function都属于函数(function): 2 与类和实例有绑定关系的function都属于方法(method). “与类和实例无绑定关系”就道出了其中的关键 我们知道python是动态的编程语言,python的类除了可以预先定义好外,还可以在执行过程中,动态地将函数绑定到类上,绑定成功后,那些函数就变成类的方法了. 定义User类 可以使用__slots__来限制绑定的属性和方法 1 user

动态绑定方法与 __slots__

Python属于动态语言,可以在类定义之外为实例新增属性与方法. class Master(object): def printstudent(self): print('100 fen') s=Master() def setage(self,age): self.age=age from types import MethodType s.setage=MethodType(setage,s) s.setage(25) print(s.age) 步骤为新建实例,然后定义需要新增的方法,引入M

Python day 9(1) 对实例动态绑定属性和方法

一:未使用slots方法(都是在class定义完之后在class外部添加的): (1)动态绑定属性 class Student(object):           pass        >>> s = Student() >>> s.name = 'Michael' # 动态给实例绑定一个属性 >>> print(s.name) Michael(2)动态绑定方法 >>> def set_age(self, age): # 定义一个

SEL方法选择器

在Objective-C中,选择器(selector)有两个意思. 一是指在代码中的方法的名称.二是指在编译是用于替换方法名称的唯一的标识符.编译后的选择器的为SEL类型.所有名称相同的方法拥有同一个选择器.通过使用选择器可以调用对象的一个方法.这是Cocoa中目标-动作这一模式能得以实现的基础. 方法和选择器 出于效率的考虑,编译后的代码中并不是使用ASCII码表示的方法名称来作为方法的选择器的.编译器会把每一个方法的名称写入到一张表中:然后用唯一的一个标识符与之结对,这样来表示运行时的方法.

OC面向对象的特性之多态性

Objective-C语言是面向对象的高级编程语言,因此,它具有面向对象编程所具有的一些特性,即:封装性.继承性和多态性. 今天介绍一下Objective-C中的多态性. 一.什么是多态 多态:不同对象以自己的方式响应相同的消息的能力叫做多态. 由于每个类都属于该类的名字空间,这使得多态称为可能.类定义中的名字和类定义外的名字并不会冲突.类的实例变量和类方法有如下特点: 和C语言中结构体中的数据成员一样,类的实例变量也位于该类独有的名字空间. 类方法也同样位于该类独有的名字空间.与C语言中的方法

设计模式之简单工厂/工厂方法/抽象工厂

这三个设计模式都属于创建型模式,之间具有关联性,就放在一起讲解.其实简单工厂模式是工厂方法的一个特例,并不是23种设计模式的一种. 使用java来写的这几个设计模式.java文件目录树如下所示: [email protected]:~/code/designpattern/SimpleFactory/src$ tree . ├── Client.java └── zy ├── abstractfactory │   ├── AccerFactory.java │   ├── AppleFacto

方法的重载与重写区别

重写和重载的区别 (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. (2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义. 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性. (3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同.无法以返回型别作为重载函