五环小胖子的博客

PHP面向对象学习笔记三

2013-07-12
Ryan
php

上一篇文章我记录了一些关于PHP继承的知识,这篇文章记录一些关于PHP多态的知识。其实不管是何种面向对象的语言,继承都是多态的一个前提。

四、PHP的多态

多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息将可以产生不同的结果,这种现象称为多态性。

单纯的看定义的话,感觉有些抽象,没关系,稍后我会举例子,供大家理解什么是多态以及在PHP中如何使用多态。前面说过PHP的重载,那么这就是实现PHP的关键所在,这也类似于在C#中用覆盖来实现多态。还有一个实现PHP多态的方法,就是继承抽象方法,并给其赋予实际的行为含义。下面我给大家举得例子使用继承抽象方法来实现多态。

在现实中我们有各种各样的形状,如:正方形、圆形、三角形等。这些形状如果看成一个个类的话,那么他们都会有一个draw方法,这个方法可以画出这个形状。讲过分析,可以抽象出一个形状的类,这个类则是所有形状的积累,这个类中有个抽象方法:draw。值得注意的是,在PHP中包含至少一个抽象方法的类必须为抽象类,而集成这个抽象类的子类,必须要实现抽象类中的抽象方法,具体的代码如下:

<?php
abstract class Shape{
    abstract public function draw();
}
class Circle extends Shape{
    public function draw(){
        echo '我画出了一个圆形<br/>';
    }
}
class Square extends Shape{
    public function draw(){
        echo '我画出了一个正方形<br/>';
    }
}
class Triangle extends Shape{
    public function draw(){
        echo '我画出了一个三角形<br/>';
    }
}
function show($obj){
    if($obj instanceof Shape){
        $obj->draw();
    }
    else{
        echo '出错啦<br/>';
    }
}
$shape = null;
$shape = new Circle();
show($shape);
$shape = new Square();
show($shape);
$shape = new Triangle();
show($shape);
?>

以下是结果:

我画出了一个圆形 我画出了一个正方形 我画出了一个三角形

五、补充知识

1、常量

<?php
class Math{
    const pi = 3.14159;
}
echo Math::pi;
?>

调用方法,类名::常量

2、静态方法

调用方式和调用常量差不多,不过需要在方法前使用static关键字

<?php
class Math{
    public static function squared($v){
        return $v*$v;
    }
}
echo Math::squared(2);
?>

3、克隆对象

使用clone关键字

<?php
$clon = clone $old;
?>

这将创建一个与对象$old具有相同类的副本,切记:不是创建引用。如果,你想改变一些克隆的行为,你在类中写__clone()这个函数,这样在使用clone时,它会被自动调用,执行你想要的行为。

4、__call魔术方法

当你调用一个类中不存在的方法时,它会被自动触发

<?php
class Myclass{
    public function __call($method,$arguarray){
        echo '调用了这个方法:'.$method;
    }
}
$obj = new Myclass();
$obj->myfunc();
?>

会输出:

调用了这个方法:myfunc

这个方法最重要的用途就是实现方法的重载,让其根据参数的不同,产生不同的行为。代码示例:

<?php
class Shape{
    public function __call($method,$arguarray){
        if($method == 'display'){
            if($arguarray[0] == 'circle'){
                $this->diplayCirlce();
            }
            else if($arguarray[0] == 'square'){
                $this->diplaySquare();
            }
            else{
                $this->displayShape();
            }
        }
    }
    private function diplayCirlce(){
        echo '我是圆形<br/>';
    }
    private function diplaySquare(){
        echo '我是正方形<br/>';
    }
    private function displayShape(){
        echo '没有具体的形状描述<br/>';
    }
}
$obj = new Shape();
$obj->display('circle');
$obj->display('square');
$obj->display();
?>

输出结果:

我是圆形 我是正方形 没有具体的形状描述

5、__toString魔术方法

当使用echo打印时,将调用这个函数。


Similar Posts