当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP5中实现多态的两种方法实例分享

发布:smiling 来源: PHP粉丝网  添加日期:2020-11-19 15:13:31 浏览: 评论:0 

多态这个概念,在Java中指的是变量可以指向的对象的类型,可是变量声明类型的子类。对象一旦创建,它的类型是不变的,多态的是变量。

在PHP5中,变量的类型是不确定的,一个变量可以指向任何类型的数值、字符串、对象、资源等。我们无法说PHP5中多态的是变量。

我们只能说在PHP5中,多态应用在方法参数的类型提示位置。

一个类的任何子类对象都可以满足以当前类型作为类型提示的类型要求。

所有实现这个接口的类,都可以满足以接口类型作为类型提示的方法参数要求。

简单的说,一个类拥有其父类、和已实现接口的身份。

通过实现接口实现多态,代码如下:

  1. <?php 
  2. interface User{ // User接口 
  3.     public function  getName(); 
  4.     public function setName($_name); 
  5.  
  6. class NormalUser implements User { // 实现接口的类. 
  7.     private $name
  8.     public function getName(){ 
  9.         return $this->name; 
  10.     } 
  11.     public function setName($_name){ 
  12.         $this->name = $_name
  13.     } 
  14.  
  15. class UserAdmin{ //操作. 
  16.     public static function  ChangeUserName(User $_user,$_userName){ 
  17.         $_user->setName($_userName); 
  18.     } 
  19. //phpfensi.com 
  20.  
  21. $normalUser = new NormalUser(); 
  22. UserAdmin::ChangeUserName($normalUser,"Tom");//这里传入的是 NormalUser的实例. 
  23. echo $normalUser->getName(); 
  24. ?> 

使用接口与组合模拟多继承

通过组合模拟多重继承。

在PHP中不支持多重继承,如果我们向使用多个类的方法而实现代码重用有什么办法么?

那就是组合。在一个类中去将另外一个类设置成属性。

下面的例子,模拟了多重继承。

接口实例

写一个概念性的例子。 我们设计一个在线销售系统,用户部分设计如下: 将用户分为,NormalUser, VipUser, InnerUser 三种。要求根据用户的不同折扣计算用户购买产品的价格。并要求为以后扩展和维护预留空间,代码如下:

  1. <?php 
  2. interface User 
  3.     public function getName(); 
  4.     public function setName($_name); 
  5.     public function getDiscount(); 
  6. abstract class AbstractUser implements User 
  7.     private $name = ""
  8.     protected  $discount = 0; 
  9.     protected  $grade = ""
  10.     function __construct($_name) { 
  11.         $this->setName($_name); 
  12.     } 
  13.     function getName() { 
  14.         return $this->name; 
  15.     } 
  16.     function setName($_name) { 
  17.     $this->name = $_name
  18.     } 
  19.     function getDiscount() { 
  20.         return $this->discount; 
  21.     } 
  22.     function getGrade() { 
  23.         return $this->grade; 
  24.     } 
  25. class NormalUser extends AbstractUser 
  26.     protected $discount = 1.0; 
  27.     protected $grade = "Normal"
  28. class VipUser extends AbstractUser 
  29.     protected $discount = 0.8; 
  30.     protected $grade = "VipUser"
  31. class InnerUser extends AbstractUser 
  32.     protected $discount = 0.7; 
  33.     protected $grade = "InnerUser"
  34. interface Product 
  35.     function getProductName(); 
  36.     function getProductPrice(); 
  37. interface Book extends Product 
  38.     function getAuthor(); 
  39. class BookOnline implements Book 
  40.     private $productName
  41.     protected $productPrice
  42.     protected $Author
  43.     function __construct($_bookName) { 
  44.         $this->productName = $_bookName
  45.     } 
  46.     function getProductName() { 
  47.         return $this->productName; 
  48.     } 
  49.     function getProductPrice() { 
  50.         $this->productPrice = 100; 
  51.         return $this->productPrice; 
  52.     } 
  53.     public function getAuthor() { 
  54.         $this->Author = "chenfei"
  55.         return $this->Author; 
  56.     } 
  57. class Productsettle 
  58.     public static function finalPrice(User $_user, Product $_product$number) { 
  59.         $price = $_user->getDiscount() * $_product->getProductPrice() * $number
  60.         return $price
  61.     } 
  62. $number = 10; 
  63. $book = new BookOnline("设计模式"); 
  64. $user = new NormalUser("tom"); 
  65. $price = Productsettle::finalPrice($user$book$number); 
  66. $str = "您好,尊敬的" . $user->getName() . "<br />"
  67. $str .= "您的级别是" . $user->getGrade() . "<br />"
  68. $str .= "您的折扣是" . $user->getDiscount() . "<br />"
  69. $str .= "您的价格是" . $price
  70. echo $str
  71. ?> 

Tags: PHP5多态

分享到: