PHP面向对象中的多态示例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();

 

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


以上是关于PHP面向对象中的多态示例的主要内容,如果未能解决你的问题,请参考以下文章

PHP 多态理解

PHP 多态理解

JS面向对象 关于类的封装继承多态

php多态

PHP 多态理解

PHP面向对象之选择工厂和更新工厂