1

我仍在掌握 OOP,但我正在尝试使用由单例数据库连接对象 (#1) 获得的数据创建一个“订单”对象。

我通过获取订单号数组然后迭代它们(#2)、创建订单对象、将订单号传递给类来实现这一点,我希望订单类从那里使用单例数据库连接查询数据库获取有关每个订单的更多信息并填充其属性(#​​3)。我的想法是,如果 Order 类在订单标识符之外是“自包含”的,它将更容易维护并且非常灵活。

我知道我可以从 getOrders() 获取数据并将其传递给类,但如果我决定需要另一个字段,我不想修改 50 个不同的查询!

这在一定程度上有效,但如果我有 10 个订单,则只有最后一个订单对象会填充数据库中的数据。我假设数据库连接在它有时间完成和填充它的属性之前被重用?

这是一些代码...

class Example {
    protected $dBCon;

    #1
    //class constructor
    public function __construct() {
    //connect to SQL database
        $this->dBCon = DB::getInstance();
    }

    #2
    public function getOrders() {
        $orders = array();
        $sql="SELECT ORDNUMBER FROM ORDERS";
        $result = $this->dBCon->executeCommand($sql);
        foreach ($result as $row) {
            $order = new Order($row['ORDNUMBER']);
            $orders[] = $order;
        }
        return $orders;
        }

}

class Order extends Example {
    public $order_number;
    public $customer;
    public $price_list; 

    #3
    public function __construct($order_number) {        
    if ($order_number) {
        //create Order from existing order
        //connect to SQL database
        $this->dBCon = DB::getInstance();
        $sql = "SELECT * FROM ORDERS WHERE ORDNUMBER = ?";
        $result = $this->dBCon->executePreparedStatement($sql, array($order_number));
        $this->order_number = $order_number;
        foreach ($result as $row) {             
            $this->customer = new Customer($row['CUSTOMER']);
            $this->price_list = $row['PRICELIST'];
        }
    }
}

例如,调用 getOrders() 会给我 10 个订单对象,但只有最后一个包含任何数据。您还可以看到,我想对每个订单的 Customer 对象执行类似的操作。

我也尝试过创建数据库连接的新实例,这确实为每个创建的对象获取数据,但是我知道我可能会创建很多数据库连接!

这是解决这个问题的正确方法还是我完全弄错了OOP棒的一端!?

4

1 回答 1

0

我会先做一个Order非常简单的:

class Order
{
    public $order_number;
    public $customer;
    public $price_list; 
}

它对 SQL 或任何形式的数据库一无所知。然后,您可以选择一两步加载这些对象;现在让我们一步一步完成。

class OrderGateway
{
    public static function getOrders(PDO $db)
    {
        $orders = array();

        $stmt = $db->query('SELECT * FROM `orders`');
        foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
            $order = new Order();
            $order->order_number = $row['ORDNUMBER'];
            $order->customer = new Customer($row['CUSTOMER']);
            $order->price_list = $row['PRICELIST'];

            $orders[] = $order;
        }

        return $orders;
    }
}

$orders = OrderFactory::getOrders($db);

这可以通过引入位于网关和数据类之间的数据映射器类来进一步改进。当您搜索“数据映射器模式”时,您可以阅读此内容。

于 2013-07-26T09:41:21.697 回答