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 相关文章推荐
一个ORACLE分页程序,挺实用的.
Oct 09 PHP
php at(@)符号的用法简介
Jul 11 PHP
PHP XML操作类DOMDocument
Dec 16 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
Mar 02 PHP
PHP文件生成的图片无法使用CDN缓存的解决方法
Jun 20 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
Nov 10 PHP
phpMyAdmin无法登陆的解决方法
Apr 27 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
Jun 17 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
PHP编程实现的TCP服务端和客户端功能示例
Apr 13 PHP
laravel框架中视图的基本使用方法分析
Nov 23 PHP
laravel框架学习笔记之组件化开发实现方法
Feb 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
一个ORACLE分页程序,挺实用的.
2006/10/09 PHP
在PHP中PDO解决中文乱码问题的一些补充
2010/09/06 PHP
php出现内存位置访问无效错误问题解决方法
2014/08/16 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
2020/07/13 PHP
学习javascript,实现插入排序实现代码
2011/07/31 Javascript
js跑马灯代码(自写)
2013/04/17 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
微信小程序 input输入及动态设置按钮的实现
2017/10/27 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
Vue实现表格批量审核功能实例代码
2019/05/28 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
基于node+websocket+html实现腾讯课堂聊天室聊天功能
2020/03/04 Javascript
[01:45]IMBATV TI4前线报道-选手到达
2014/07/07 DOTA
零基础学Python(一)Python环境安装
2014/08/20 Python
python使用PIL缩放网络图片并保存的方法
2015/04/24 Python
在Lighttpd服务器中运行Django应用的方法
2015/07/22 Python
python实现教务管理系统
2018/03/12 Python
python实现雨滴下落到地面效果
2018/06/21 Python
Sanic框架流式传输操作示例
2018/07/18 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
python装饰器的特性原理详解
2019/12/25 Python
使用Tensorflow将自己的数据分割成batch训练实例
2020/01/20 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
HTML5 Canvas的事件处理介绍
2015/04/24 HTML / CSS
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
天地会口号
2014/06/17 职场文书
2014年售后服务工作总结
2014/11/18 职场文书
2015年银行大堂经理工作总结
2015/04/24 职场文书
讲文明倡议书
2015/04/29 职场文书