通常的做法 都是通过权限配置来实现,当然还有利用数据库做字段控制表的方式来管理返回数据。但是我今天要演示的是基于面向对象的处理思想实现。
面向对象思想的设计思路是:不管你有多少角色进来查询,都有其共同要显示的字段,因此,我们利用父子类的思想来实现。就是抽离查询结果集的返回公共信息,然后各子类定义自己的特性字段。
先看下我的表结构
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);
查看运行效果
结论:我们只要切换不同的角色类型 就能得到不同字段的查询结果,一旦你要新增角色,你不用动核心代码,只要按照需求增加不同的子类就能实现,这种方法充分体现了解耦思想和面向对象思想,方便功能的拓展。个人以为值得学习。本人代码能力有限,代码里面的命名可能不规范,对这个代码演示有建议的人欢迎留言一起讨论 学习进步。