Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中从MySQL动态生成类属性有什么缺点?_Php_Mysql_Class_Pdo - Fatal编程技术网

在PHP中从MySQL动态生成类属性有什么缺点?

在PHP中从MySQL动态生成类属性有什么缺点?,php,mysql,class,pdo,Php,Mysql,Class,Pdo,抱歉,如果这个问题听起来令人困惑,可能还没有用最好的措辞,但这里有一个例子 假设我们有一个包含不同列的“sales”表,我们想用php创建一个sales类,我传统上是这样处理的 class Sale { public $id; public $userID; public $customerID; public $sale_net; public $sale_vat; public $sale_gross; public $duratio

抱歉,如果这个问题听起来令人困惑,可能还没有用最好的措辞,但这里有一个例子

假设我们有一个包含不同列的“sales”表,我们想用php创建一个sales类,我传统上是这样处理的

class Sale 
{
    public $id;
    public $userID;
    public $customerID;
    public $sale_net;
    public $sale_vat;
    public $sale_gross;
    public $duration;
    public $sale_date;
    public $end_date;

    private $table = "sales";
    private $pk = "id";

function __construct($saleID=NULL){
    if($saleID!=NULL){
        global $pdo;
        $stm = $pdo->prepare("SELECT * FROM {$this->table} WHERE {$this->pk} = ?");
        $stm->execute(array($saleID));
        if($stm->rowCount() > 0)
            {
            $data = $stm->fetchObject();
            $this->id = $saleID;
            $this->userID = $data->userID;
            $this->customerID = $data->customerID;
            $this->sale_net = $data->sale_net;
            $this->sale_vat = $data->sale_vat;
            $this->sale_gross = $data->sale_gross;
            $this->duration = $data->duration;
            $this->sale_date = $data->sale_date;
            $this->end_date = $data->end_date;
            }
        }
    } 
}
现在说到这里,以下方法的缺点是什么

class Sale 
{
    private $table = "sales";
    private $pk = "id";

    function __construct($saleID=NULL){
        if($saleID!=NULL){
            global $pdo;
            $stm = $pdo->prepare("SELECT * FROM {$this->table} WHERE {$this->pk} = ?");
            $stm->execute(array($saleID));
            if($stm->rowCount() > 0)
            {
                $this->isValid = true;
                $data = $stm->fetchAll();
                $sale = $data[0];
                foreach ($sale as $property => $value) {
                    $this->$property = $value;
                }
            }
        }
    } 

我看到一个优点是,如果将列添加到sales表中,我可以立即访问它们,而无需修改类本身

对象不必镜像数据库表(无论如何,在ORM模型之外);例如,您可能希望将订单行作为
Sale
对象的一部分;这很有道理。。。但它们将位于与订单标题数据完全不同的表中。您的PHP对象应该具有应用程序的逻辑数据结构,而不是数据存储的基本方式。将所有类方法作为公共方法也违背了OOP的核心概念之一,我不认为第二种选择有任何缺点;结果相同,但代码比选项1少。不管是1还是2,我希望您永远不要计划重命名DB列。我同意@CD001,因为
Sale
类似乎更适合作为底层数据的抽象层,而不是精确的镜像。即使您不知道数据的来源,也要努力使类可用。