欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP面向对象学习笔记三

程序员文章站 2022-06-14 22:09:03
...

上一篇文章我记录了一些关于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打印时,将调用这个函数。