PHP面向对象中的多态示例

PHP不支持重载实现多态,所以PHP中的多态较其他语言中的多态可能是个假的“多态”

而PHP中我们使用回调函数这种方法可以实现PHP中的“多态”

演示场景:用户登录

一般而言网站分为前后台,那么前后端都有一套登录系统 ,前台的为用户登录 ,后台的为管理员登录。

此时我们就能将登录方法抽离出来写成一个公共的方法  不管是前台还是后台用户登录时都调用同一个方法,这样使得登录方法具备高重用性高扩展性

以下演示代码为原生PHP编写(本演示代码只是提供思路并无具体业务逻辑处理)

思路:UserController.php实例化Model->将实例化的Model作为参数传给Userver.php进行验证

其中User.php为抽象类   AdminModel.php和IndexModel.php继承User.php并实现其中的方法

URL链接:

代码:

UserController.php
 1 <?php
 2
 3 use Server\UserServer;
 4 use Model\IndexModel;
 5 use Model\AdminModel;
 6
 7 spl_autoload_register(function ($class) {
 8     $class = str_replace(‘\\‘,‘/‘,$class);
 9     require ‘../‘.$class . ‘.php‘;
10 });
11
12 if($_REQUEST[‘act‘]){
13
14     $IndexModel = new IndexModel();
15     $AdminModel = new AdminModel();
16
17     $UserController_a = new UserServer($IndexModel);
18     $UserController_b = new UserServer($AdminModel);
19
20     $Function = $_REQUEST[‘act‘];
21
22     echo $UserController_a->$Function(‘user1‘,‘123456‘);
23     echo ‘<br>‘;
24     echo $UserController_b->$Function(‘admin‘,‘admin123‘);
25 }
UserServer.php
 1 <?php
 2 namespace Server;
 3
 4 class UserServer{
 5     private $identity;
 6
 7     public function __construct($identity){
 8         $this->identity = $identity;
 9     }
10
11     public function login($username,$password){
12         return $this->identity->login($username,$password);
13     }
14 }
User.php
 1 <?php
 2 namespace Abstracts;
 3 /**
 4  * Created by PhpStorm.
 5  * User: msi
 6  * Date: 17-11-16
 7  * Time: 上午8:48
 8  */
 9
10 abstract class User{
11
12     abstract public function login($username,$password);
13
14 }
IndexModel.php
 1 <?php
 2 namespace Model;
 3
 4 use Abstracts\User;
 5
 6 spl_autoload_register(function ($class) {
 7     $class = str_replace(‘\\‘,‘/‘,$class);
 8     require ‘../‘.$class . ‘.php‘;
 9 });
10
11 class IndexModel extends User{
12
13     public function login($username,$password){
14         return ‘现在调用的是Index的登录,‘.‘用户名是:‘.$username.‘,密码是:‘.$password;
15     }
16
17 }
AdminModel.php
 1 <?php
 2 namespace Model;
 3
 4 use Abstracts\User;
 5
 6 spl_autoload_register(function ($class) {
 7     $class = str_replace(‘\\‘,‘/‘,$class);
 8     require ‘../‘.$class . ‘.php‘;
 9 });
10
11 class AdminModel extends User{
12
13     public function login($username,$password){
14         return ‘现在调用的是Admin的登录,‘.‘用户名是:‘.$username.‘,密码是:‘.$password;
15     }
16
17 }

最后输出结果

刚涉及到多态的时候肯定会有一个疑惑  为什么不直接实例化 IndexModel 调用下面的 login 方法  这样代码还可以少写很多

但是如果再添加一种角色登录只需要新写一个Model并让这个Model继承并实现User.php中的方法,而登录的方法却依然是调用UserServer.php下的login方法

而这就提高UserServer.php的重用性和扩展性

我们甚至可以将UserController.php中的实例化Model改为变量函数的方法来实例化,这样连UserController.php也达到了一个可重用性

1     $Model = ‘Model\\‘.$_REQUEST[‘Model‘];//$_REQUEST[‘Model‘]值为IndexModel;
2     $IndexModel = new $Model();
3     $AdminModel = new AdminModel();

本文章来源博客园 -酸辣土豆丝-  转载文章请标明出处

时间: 2024-11-01 18:51:32

PHP面向对象中的多态示例的相关文章

python之面向对象中的多态

直接看代码: class Dog: def __init__(self,name): self.name = name def play(self): print("%s在汪汪汪" % self.name) class SonDog(Dog): def play(self): print("%s不仅会汪,还会飞" % self.name) class Person: def __init__(self,name): self.name = name def game

设计模式-Template(行为模式) 采用 继承的方式 将算法封装在抽象基类中,在子类中实现细节。利用面向对象中的多态实现算法实现细节和高层接口的松耦合。

以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Template.h class AbstractClass { public: virtual ~AbstractClass(); void TemplateMethod(); protected: virtual void PrimitiveOperation1() = 0; virtual void PrimitiveOperation2() = 0; AbstractClass(); private: }; c

java中实现多态的机制是什么?

多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次深入Java核心,一起学习Java中多态性的实现. “polymorphism(多态)”一词来自希腊语,意为“多种形式”.多数Java程序员把多态看作对象的一种能力,使其能调用正确的方法版本.尽管如此,这种面向实现的观点导致了多态的神奇功能,胜于仅仅把多态看成纯粹的概念. Java中的多态总是子类型

面向对象中的接口和多态

接口的作用是用来制定规范,以便让后面的程序根据这个规范来实现. 接口的声明方式:interface 接口名{},接口只能声明抽象方法,至少要有一个,但是声明的抽象方法前不需要用abstract修饰. 声明一个类实现接口,class demo implements interface_name {},当一个类实现接口的时候,这个类必须实现接口里定义的所有抽象方法.一个类可以既同时继承一个类又实现多个接口,class demo2 extends demo implements interface1,

Mysql数据库大量删除操作及谈面向对象中的封装继承和多态原理(图)

Mysql数据库大量删除操作及谈面向对象中的封装继承和多态原理(图)最近进行数据库操作,遇到一个问题,就是大量删除一个数据表中的数据后,由于设定了id是自增的,导致再插入时,默认生成的id会很大,这个时候想要再次插入新的数据,应该怎么办呢?1.明确目前最后一个id的大小select id from tags order by id DESC limit 0,1; 假设返回的是9,则设置数据表从10开始自增 2.修改这个数据表从10开始自增alter table tags auto_increme

深入分析面向对象中的对象概念(转)

OOP:面向对象编程,一提到面向对象,大家可能就想到类,接口.一说特性,大家可能张口就来:继承.封装.多态,那么到底什么样的对象(类)才是真正意义上的对象呢?特别是现在流行的DDD领域驱动设计思想,讲究职责划分,那么如何定义一个对象(类)它应该具有的一些特性.行为方法及承担责任成为关键. 一个看似简单的问题,其实也是耐人思索,之前也在网上看到一些人关于讨论类的设计问题,认为设计类时不应该考虑数据库,我觉得这只是实现真正的面向对象设计的基础,也是前提条件,大多数程序员之前都是受面向过程编程思想的影

深入分析面向对象中的对象概念

OOP:面向对象编程,一提到面向对象,大家可能就想到类,接口.一说特性,大家可能张口就来:继承.封装.多态,那么到底什么样的对象(类)才是真正意义上的对象呢?特别是现在流行的DDD领域驱动设计思想,讲究职责划分,那么如何定义一个对象(类)它应该具有的一些特性.行为方法及承担责任成为关键. 一个看似简单的问题,其实也是耐人思索,之前也在网上看到一些人关于讨论类的设计问题,认为设计类时不应该考虑数据库,我觉得这只是实现真正的面向对象设计的基础,也是前提条件,大多数程序员之前都是受面向过程编程思想的影

第05章(面向对象——中)

1 /***************** 2 ***第五章面向对象(中) 3 *******知识点: 4 **************1.多态 5 ******************1.1 概念 6 ******************1.2 实现方式 7 **************2.抽象类 8 ******************2.1 关键字 9 ******************2.2 概念定义 10 ******************2.3 使用 11 ************

面向对象的JavaScript --- 多态

面向对象的JavaScript --- 多态 多态 "多态"一词源于希腊文 polymorphism,拆开来看是poly(复数)+ morph(形态)+ism,从字面上我们可以理解为复数形态. 多态的实际含义是:同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果.换句话说,给不同的对象发送同一个消息的时候,这些对象会根据这个消息分别给出不同的反馈.从字面上来理解多态不太容易,下面我们来举例说明一下. ? 主人家里养了两只动物,分别是一只鸭和一只鸡,当主人向它们发出&quo