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