通常的做法 都是通過權限配置來實現,當然還有利用數據庫做字段控制表的方式來管理返回數據。但是我今天要演示的是基於面向對象的處理思想實現。
面向對象思想的設計思路是:不管你有多少角色進來查詢,都有其共同要顯示的字段,因此,我們利用父子類的思想來實現。就是抽離查詢結果集的返回公共信息,然後各子類定義自己的特性字段。
先看下我的表結構
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);
查看運行效果
結論:我們只要切換不同的角色類型 就能得到不同字段的查詢結果,一旦你要新增角色,你不用動核心代碼,只要按照需求增加不同的子類就能實現,這種方法充分體現瞭解耦思想和麪向對象思想,方便功能的拓展。個人以爲值得學習。本人代碼能力有限,代碼裏面的命名可能不規範,對這個代碼演示有建議的人歡迎留言一起討論 學習進步。