首页 > 语言 > PHP > 正文

php 类中多态的应用

2024-09-04 11:43:45
字体:大 中 小
来源:转载
供稿:网友

Instanceof:用来测定一个给定的对象是否来自指定的对象类,代码如下:

  1. <?php 
  2.  
  3. class A{} 
  4.  
  5. class B{} 
  6.  
  7. $thing=new A(); 
  8.  
  9. //return true 
  10.  
  11. if ($thing instanceof A) { 
  12.  
  13.     echo 'A'; 
  14.  
  15. } 
  16.  
  17. //return false 
  18.  
  19. if ($thing instanceof B) { 
  20.  
  21.     echo 'B'; 
  22.  
  23. } 
  24.  
  25. ?> 
  26.  
  27. //运行结果: 
  28.  
  29. //A 
  30.  
  31. <?php 
  32.  
  33. header("Content-Type:text/html;charset=UTF-8"); 
  34. //开源代码Vevb.com 
  35. interface MyUsb{ 
  36.  
  37.     function type(); 
  38.  
  39.     function alert(); 
  40.  
  41. } 
  42.  
  43. class Zip implements MyUsb{ 
  44.  
  45.     function type(){ 
  46.  
  47.        echo "2.0"; 
  48.  
  49.     } 
  50.  
  51.     function alert(){ 
  52.  
  53.        echo "正在检查U盘驱动"; 
  54.  
  55.     } 
  56.  
  57. } 
  58.  
  59. class Mp3 implements MyUsb{ 
  60.  
  61.     function type(){ 
  62.  
  63.        echo "1.0"; 
  64.  
  65.     } 
  66.  
  67.     function alert(){ 
  68.  
  69.        echo "正在检查Mp3驱动"; 
  70.  
  71.     } 
  72.  
  73. } 
  74.  
  75. class Mypc{ 
  76.  
  77.     function PcUsb($what) 
  78.  
  79.     { 
  80.  
  81.        $what->type(); 
  82.  
  83.        $what->alert(); 
  84.  
  85.     } 
  86.  
  87. } 
  88.  
  89. $pc=new Mypc(); 
  90.  
  91. $zip=new Zip(); 
  92.  
  93. $mp3=new Mp3(); 
  94.  
  95. $pc->PcUsb($zip);//当插上的是U盘的时候 
  96.  
  97. echo "<br/>"; 
  98.  
  99. $pc->PcUsb($mp3);//当插上的是MP3的时候 
  100.  
  101. ?> 
  102.  
  103. //运行结果: 
  104.  
  105. //2.0正在检查U盘驱动 
  106. //1.0正在检查Mp3驱动 

对象引用都是一样的不分父类引用,还是子类引用,我们现在来看一个例子,首先还是要使用多态就要有父类对象和子类对象的关系,做一 个形状的接口或是抽象类做为父类,里面有两个抽象方法,一个求周长的方法,另一个是求 面积的方法,这接口的子类是多种不同的形状,每个形状又都有周长和面积,又因为父类是 一个接口,所以子类里面就必须要实现父类的这两个周长和面积的抽象方法,这样做的目的 是每种不同形状的子类都遵守父类接口的规范,都要有求周长和求面积的方法,代码如下:

  1. <?php 
  2. //定义了一个形状的接口,里面有两个抽象方法让子类去实现  
  3. interface Shape{  
  4. function area();  
  5. function perimeter();  
  6. }  
  7. //定义了一个矩形子类实现了形状接口中的周长和面积  
  8. class Rect implements Shape{  
  9. private $width;  
  10. private $height;  
  11. function __construct($width, $height){  
  12. $this->width=$width;  
  13. $this->height=$height;  
  14. }  
  15. function area(){  
  16. return "矩形的面积是:".($this->width*$this->height);  
  17. }  
  18. function perimeter(){  
  19. return "矩形的周长是:".(2*($this->width+$this->height));  
  20. }  
  21. }  
  22. //定义了一个圆形子类实现了形状接口中的周长和面积  
  23. class Circular implements Shape{  
  24. private $radius;  
  25. function __construct($radius){  
  26. $this->radius=$radius;  
  27. }  
  28. function area(){  
  29. return "圆形的面积是:".(3.14*$this->radius*$this->radius);  
  30. }  
  31. function perimeter(){  
  32. return "圆形的周长是:".(2*3.14*$this->radius);  
  33. }  
  34. }  
  35. //把子类矩形对象赋给形状的一个引用  
  36. $shape=new Rect(5, 10);  
  37. echo $shape->area()."<br>";  
  38. echo $shape->perimeter()."<br>";  
  39. //把子类圆形对象赋给形状的一个引用  
  40. $shape=new Circular(10);  
  41. echo $shape->area()."<br>";  
  42. echo $shape->perimeter()."<br>";  
  43. ?> 
  44. /* 
  45. 上例执行结果:  
  46. 执行结果  
  47. 矩形的面积是:50  
  48. 矩形的周长是:30  
  49. 圆形的面积是:314  
  50. 圆形的周长是:62.8 
  51. */ 

通过上例我们看到,把矩形对象和圆形对象分别赋给了变量$shape,调用$shape 引用中 的面积和周长的方法,出现了不同的结果,这就是一种多态的应用,其实在我们PHP 这种弱 类形的面向对象的语言里面,多态的特性并不是特别的明显,其实就是对象类型变量的变项应用.

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表