利用面向对象的思想实现不同的角色查询同一个商品返回不同的数据信息

通常的做法 都是通过权限配置来实现,当然还有利用数据库做字段控制表的方式来管理返回数据。但是我今天要演示的是基于面向对象的处理思想实现。

 面向对象思想的设计思路是:不管你有多少角色进来查询,都有其共同要显示的字段,因此,我们利用父子类的思想来实现。就是抽离查询结果集的返回公共信息,然后各子类定义自己的特性字段。

先看下我的表结构

CREATE TABLE `goodsrole` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `price` decimal(10,2) NOT NULL,
  `stock` int(10) NOT NULL,
  `goods_desc` varchar(200) DEFAULT NULL,
  `goods_area` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

上面这个表是商品表 当然命名可能不太规范,但是这里咱们先忽略。。

数据库里面的数据截图

 

 

然后在看我定义的父子类

<?php

/**
 * 商品查询父类
 */

class role{
    // 商品名称
    public $name;
    // 商品价格
    public $price;
    // 商品库存
    public $stock;
}
<?php

class role1 extends role
{
    // 商品描述
    public $goods_desc;
}
<?php


class role2 extends role
{
    // 商品产地
    public $goods_area;
}

 

 

role为父类  role1  role2为子类。。。

 

然后就是商品查询类  代码比较简单,但是效果是实现了

<?php

/**
 * Class goods
 * 商品信息处理类
 */
class goods{

    // 查询商品信息,根据不同的字段列表返回不同的数据结果
    function get_goods_info_by_fields($id,$fields){
        if(empty($fields)){
            return [];
        }
        $sql = "select ".$fields." from goodsrole where id=".$id;
        //echo $sql;die;
        // 为了演示方便 我这里就不用框架代码实现 写原生查询方式
        $db = mysqli_connect('115,54,2,66','d5588','5855588','goodsdb');
        mysqli_query($db,"set names utf8");
        $res = mysqli_query($db,$sql);
        return mysqli_fetch_assoc($res);
    }
}

接下来是客户端处理类

<?php

/**
 *  此文件为演示程序代码文件
 */
header("Content-type: text/html; charset=utf-8");

// 我写的是一种演示方案 所以类的自动加载先忽略
include "role.php";
include "role1.php";
include "role2.php";
include "goods.php";


// 假设是角色1 登录
$role_type = 2;
// 商品id
$id = 1;
$role = null;
if($role_type ==1 ){
    $role = new role1();
}
elseif ($role_type ==2){
    $role = new role2();
}


// 利用反射机制获取到子类的属性列表
$reflect = new ReflectionClass($role);
$pros = $reflect->getDefaultProperties();
$fields = implode(',',array_keys($pros));
$goods = new goods();
$data = $goods->get_goods_info_by_fields($id,$fields);

echo "<pre>";print_r($data);

查看运行效果

 

结论:我们只要切换不同的角色类型 就能得到不同字段的查询结果,一旦你要新增角色,你不用动核心代码,只要按照需求增加不同的子类就能实现,这种方法充分体现了解耦思想和面向对象思想,方便功能的拓展。个人以为值得学习。本人代码能力有限,代码里面的命名可能不规范,对这个代码演示有建议的人欢迎留言一起讨论 学习进步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章