在PHP中正确实现模型类

时间:2017-12-27 05:48:49

标签: php mysql oop model

您好,我想问一下我的模型类的实现是否至少与OOP风格一致。 我将它声明为一个抽象,以便它只能用于扩展 类

示例代码:

<?php
/**
 * class model handles dbconfig and some common query transaction
 * i declare it as an abstract so that it can only be used on extending the 
 *class
 */
abstract class Model
{
    //db config
    protected $sHost     = "localhost";
    protected $sUser     = "root";
    protected $sPass     = " ";
    protected $sDb       = "test";
    protected $sEngine = "MySQL";  
    protected $conn ;

    //constructor
    public function __construct()
    {

        $this->conn = new mysqli($this->sHost, $this->sUser, $this->sPass , $this->sDb);

    }   


    protected function db_query_list($sSql){

        if ($resultset = $this->conn->query($sSql)) {
            if ($resultset->num_rows > 0) {
                $data = array();
                while( $row = $resultset->fetch_assoc() ) {
                    $data[] = array_change_key_case($row);
                }
            }else {
            $data = false;
            }
        } else {
            $data = false;
        }

        $resultset->close();
        return $data;

    }

    protected function execute_query($SQL) {

        $run = $this->conn->query($this->sEngine);

        return $run;
    }

}   

然后在实现中扩展CustomerModel中的模型

<?php

require "Model.php";

class CustomerModel extends Model
{

    public function __construct()
    {
        parent::__construct();
    }

    public function getAllCustomer()
    {
        $sSql = "SELECT *
                 FROM t_classification_header
                 ";


        return $this->db_query_list($sSql);
    }

}   

请注意,我使用 parent :: __ construct(); 。 我是OOP的新手任何帮助都是我的荣幸 欢迎提出任何意见和建议。 谢谢

1 个答案:

答案 0 :(得分:1)

1)创建分离的类,甚至是单例,实际与DB交互,将其作为模型构造函数的参数传递。为什么?如果您与5个客户合作,那么您的代码将创建5个与DB的连接。 (依赖注入/组成)

2)不要 func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { if let rootViewController = UIApplication.topViewController() { if rootViewController is PostImageZoomViewController { let controller = rootViewController as! PostImageZoomViewController if controller.isPresented { return .all } } } return .portrait } 。将结果包装到某些return $this->db_query_list($sSql);和/或将每行包装到CustomersList

3)我会使用方法CustomerCustomers($DB)等创建课程all(),而不是byId($id)。说真的,我们不是照片代理商,不与模特合作。是的,该类是一个数据模型,但为什么要烦恼这个代码呢?对我们来说,这是一个具体的CustomerModel,具有特定的数据和行为。