ホームページ > php教程 > PHP源码 > PHP面向对象——多态

PHP面向对象——多态

PHP中文网
リリース: 2016-05-25 17:12:03
オリジナル
1901 人が閲覧しました

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

      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.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート