zoukankan      html  css  js  c++  java
  • PHP面向对象——多态

          多态是指在面向对象中能够根据使用类的上下文来重新定义或改变类的性质和行为。    

          PHP不支持重载实现多态,但是PHP可以变向的实现多态效果。如下:

    class a{
        function test($i){ // $i可以是任何类型的变量
            print_r $i;
        }
    }

          上例,可以看出由于PHP是弱类型语言,所以$i可以是任何类型的变量,这样一个函数就可以实现如java等强类型语言中靠改变参数类型重载方法的多态形式。

          这种形式比JAVA的参数类型重载更便捷高效,但也存在问题,如下:

    <?php
    /**
    教师类有一个drawPolygon()方法需要一个Polygon类,用来画多边形,此方法内部调用多边形的draw()方法,但由于弱类型,我们可以传入Circle类,就会调用Circle类的draw方法,这就事与愿违了。甚至可以传入阿猫、阿狗类,如果这些类没有draw()方法还会报错。
    */
    class Teacher{
        function drawPolygon($polygon){ 
            $polygon->draw(); 
        }    
    }
    
    class Polygon{
        function draw(){
            echo "draw a polygon";
        }
    }
    
    class Circle{
        function draw(){
            echo "draw a circle";
        }
    }
    ?>

          可以看出这样灵活的多态,需要一些控制,在PHP5.3以后可以对参数做类型限制,如下:

    // 仿java,在变量参数前加一个限制类名
        function drawPolygon(Polygon $polygon){ 
            $polygon->draw(); 
        }

          这样就限制了只能传入Polygon及其子类。

         还有一只是改变参数数量的重载,同样是因为PHP也不支持方法的重载,所以也需要些变通的方法实现,如下:

    <?php
    // 通过可变参数来达到改变参数数量重载的目的
    // 不是必须传入的参数,必须在函数定义时赋初始值
    function open_database($DB, $cache_size_or_values=null, $cache_size=null)
    {
        switch (function_num_args())  // 通过function_num_args()函数计算传入参数的个数,根据个数来判断接下来的操作
        {
            case 1:
                $r = select_db($DB);
                break;
            case 2:
                $r = select_db($DB, $cache_size_or_values);
                break;
            case 3:
                $r = select_db($DB, $cache_size_or_values, $cache_size);
                break;
        }
        return is_resource($r);
    }
    ?>

    燕十八php公益课,网址:http://zixue.it/ ,YY频道:88354001,YY群:7840433

  • 相关阅读:
    Spring DI模式 小样例
    java中经常使用的日期格式化(全)
    循环-15. 统计素数并求和(20)
    [Unity3D]Unity3D游戏开发之自己主动寻路与Mecanim动画系统的结合
    【UVA】11732
    Mac OS使用技巧之十六:系统失去响应怎么办?
    C# 保存窗口为图片(保存纵断面图)
    Linux Resin 安装
    Etcd学习(二)集群搭建Clustering
    android中选择控件与选择界面自然过度效果的实现--一种新的交互设计
  • 原文地址:https://www.cnblogs.com/giantpanda/p/2763998.html
Copyright © 2011-2022 走看看