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中for循环语句的几种变型
Mar 16 PHP
php magic_quotes_gpc的一点认识与分析
Aug 18 PHP
有关JSON以及JSON在PHP中的应用
Apr 09 PHP
PHP程序开发范例学习之表单 获取文本框的值
Aug 08 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
Oct 31 PHP
PHP用strstr()函数阻止垃圾评论(通过判断a标记)
Sep 28 PHP
php指定函数参数默认值示例代码
Dec 04 PHP
php中随机函数mt_rand()与rand()性能对比分析
Dec 01 PHP
PHP处理数组和XML之间的互相转换
Jun 02 PHP
PHP PDOStatement::errorCode讲解
Jan 31 PHP
php 策略模式原理与应用深入理解
Sep 25 PHP
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
Apr 01 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
PHP.ini安全配置检测工具pcc简单介绍
2015/07/02 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
JavaScript面向对象编程
2008/03/02 Javascript
JQuery Tips(3) 关于$()包装集内元素的改变
2009/12/14 Javascript
纯js实现背景图片切换效果代码
2010/11/14 Javascript
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
2016/08/29 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
2016/10/18 Javascript
prototype与__proto__区别详细介绍
2017/01/09 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
老生常谈javascript的面向对象思想
2017/08/22 Javascript
jQuery实现html双向绑定功能示例
2017/10/09 jQuery
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
详细介绍Python语言中的按位运算符
2013/11/26 Python
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
2017/07/20 Python
python的socket编程入门
2018/01/29 Python
Flask框架实现给视图函数增加装饰器操作示例
2018/07/16 Python
详解flask表单提交的两种方式
2018/07/21 Python
python 公共方法汇总解析
2019/09/16 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
python获取linux系统信息的三种方法
2020/10/14 Python
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
2016/12/30 HTML / CSS
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
优秀教师获奖感言
2014/01/31 职场文书
大家访活动实施方案
2014/03/10 职场文书
励志演讲稿500字
2014/08/21 职场文书
四风问题民主生活会对照检查材料思想汇报
2014/09/27 职场文书
公司的力量观后感
2015/06/05 职场文书
保护环境的宣传语
2015/07/13 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server