利用面向對象的思想實現不同的角色查詢同一個商品返回不同的數據信息

通常的做法 都是通過權限配置來實現,當然還有利用數據庫做字段控制表的方式來管理返回數據。但是我今天要演示的是基於面向對象的處理思想實現。

 面向對象思想的設計思路是:不管你有多少角色進來查詢,都有其共同要顯示的字段,因此,我們利用父子類的思想來實現。就是抽離查詢結果集的返回公共信息,然後各子類定義自己的特性字段。

先看下我的表結構

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);

查看運行效果

 

結論:我們只要切換不同的角色類型 就能得到不同字段的查詢結果,一旦你要新增角色,你不用動核心代碼,只要按照需求增加不同的子類就能實現,這種方法充分體現瞭解耦思想和麪向對象思想,方便功能的拓展。個人以爲值得學習。本人代碼能力有限,代碼裏面的命名可能不規範,對這個代碼演示有建議的人歡迎留言一起討論 學習進步。

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