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


Posted in PHP onApril 21, 2014

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

我们只能说在PHP5中,多态应用在方法参数的类型提示位置。
一个类的任何子类对象都可以满足以当前类型作为类型提示的类型要求。
所有实现这个接口的类,都可以满足以接口类型作为类型提示的方法参数要求。
简单的说,一个类拥有其父类、和已实现接口的身份。

通过实现接口实现多态

<?php
interface User{ // User接口
    public function  getName();
    public function setName($_name);
}class NormalUser implements User { // 实现接口的类.
    private $name;
    public function getName(){
        return $this->name;
    }
    public function setName($_name){
        $this->name = $_name;
    }
}
class UserAdmin{ //操作.
    public static function  ChangeUserName(User $_user,$_userName){
        $_user->setName($_userName);
    }
}
$normalUser = new NormalUser();
UserAdmin::ChangeUserName($normalUser,"Tom");//这里传入的是 NormalUser的实例.
echo $normalUser->getName();
?>

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

通过组合模拟多重继承。

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

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

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

接口实例

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

<?php
interface User
{
    public function getName();
    public function setName($_name);
    public function getDiscount();
}
abstract class AbstractUser implements User
{
    private $name = "";
    protected  $discount = 0;
    protected  $grade = "";
    function __construct($_name) {
        $this->setName($_name); 
    }
    function getName() {
        return $this->name;
    }
    function setName($_name) {
    $this->name = $_name;
    }
    function getDiscount() {
        return $this->discount;
    }
    function getGrade() {
        return $this->grade;
    }
}
class NormalUser extends AbstractUser
{
    protected $discount = 1.0;
    protected $grade = "Normal";
}
class VipUser extends AbstractUser
{
    protected $discount = 0.8;
    protected $grade = "VipUser";
}
class InnerUser extends AbstractUser
{
    protected $discount = 0.7;
    protected $grade = "InnerUser";
}
interface Product
{
    function getProductName();
    function getProductPrice();
}
interface Book extends Product
{
    function getAuthor();
}
class BookOnline implements Book
{
    private $productName;
    protected $productPrice;
    protected $Author;
    function __construct($_bookName) {
        $this->productName = $_bookName;
    }
    function getProductName() {
        return $this->productName;
    }
    function getProductPrice() {
        $this->productPrice = 100;
        return $this->productPrice;
    }
    public function getAuthor() {
        $this->Author = "chenfei";
        return $this->Author;
    }
}
class Productsettle
{
    public static function finalPrice(User $_user, Product $_product, $number) {
        $price = $_user->getDiscount() * $_product->getProductPrice() * $number;
        return $price;
    }
}
$number = 10;
$book = new BookOnline("设计模式");
$user = new NormalUser("tom");
$price = Productsettle::finalPrice($user, $book, $number);
$str = "您好,尊敬的" . $user->getName() . "<br />";
$str .= "您的级别是" . $user->getGrade() . "<br />";
$str .= "您的折扣是" . $user->getDiscount() . "<br />";
$str .= "您的价格是" . $price;
echo $str;
?>
PHP 相关文章推荐
php获取mysql版本的几种方法小结
Mar 25 PHP
PHP 类商品秒杀计时实现代码
May 05 PHP
批量修改RAR文件注释的php代码
Nov 20 PHP
PHP和javascript常用正则表达式及用法实例
Jul 01 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
Oct 30 PHP
php获取本周开始日期和结束日期的方法
Mar 09 PHP
php中mysql操作buffer用法详解
Mar 19 PHP
php 在字符串指定位置插入新字符的简单实现
Jun 28 PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
Aug 03 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 PHP
详解php curl带有csrf-token验证模拟提交方法
Apr 18 PHP
php传值和传引用的区别点总结
Nov 19 PHP
PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
Apr 21 #PHP
PHP正则提取不包含指定网址的图片地址的例子
Apr 21 #PHP
phpmyadmin打开很慢的解决方法
Apr 21 #PHP
PHP递归删除目录几个代码实例
Apr 21 #PHP
PHP批量生成静态HTML的简单原理和方法
Apr 20 #PHP
php setcookie函数的参数说明及其用法
Apr 20 #PHP
PHP数据库操作之基于Mysqli的数据库操作类库
Apr 19 #PHP
You might like
网站当前的在线人数
2006/10/09 PHP
PHP中for与foreach的区别分析
2011/03/09 PHP
php处理复杂xml数据示例
2016/07/11 PHP
Laravel+jQuery实现AJAX分页效果
2016/09/14 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
tp5.1 框架数据库高级查询技巧实例总结
2020/05/25 PHP
jQuery 页面载入进度条实现代码
2009/02/08 Javascript
JavaScript的类型转换(字符转数字 数字转字符)
2010/08/30 Javascript
jQuery子属性过滤选择器用法分析
2015/02/10 Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
2016/09/21 Javascript
AngularJS中transclude用法详解
2016/11/03 Javascript
JavaScript实现邮箱地址自动匹配功能代码
2016/11/28 Javascript
详解angular2实现ng2-router 路由和嵌套路由
2017/03/24 Javascript
js闭包学习心得总结
2018/04/17 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
详解ES6中的Map与Set集合
2019/03/22 Javascript
vue子传父关于.sync与$emit的实现
2019/11/05 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
解决vue页面渲染但dom没渲染的操作
2020/07/27 Javascript
vue项目打包为APP,静态资源正常显示,但API请求不到数据的操作
2020/09/12 Javascript
Python Tkinter实现简易计算器功能
2018/01/30 Python
python实现堆和索引堆的代码示例
2018/03/19 Python
python中ASCII码和字符的转换方法
2018/07/09 Python
Python内存读写操作示例
2018/07/18 Python
Python绘制堆叠柱状图的实例
2019/07/09 Python
Python测试Kafka集群(pykafka)实例
2019/12/23 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
Python selenium爬虫实现定时任务过程解析
2020/06/08 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
加拿大高尔夫超市:Golf Town
2018/01/12 全球购物
档案检查欢迎词
2014/01/13 职场文书
企业员工薪酬方案
2014/06/04 职场文书
个人工作作风整改措施思想汇报
2014/10/13 职场文书
领导班子整改措施
2014/10/24 职场文书
课文《燕子》教学反思
2016/02/17 职场文书
类和原型的设计模式之复制与委托差异
2022/07/07 Javascript