class来从另一个类创建对象,但开销较小

时间:2012-11-24 18:59:57

标签: php class object

我要做的是编写一个“搜索”类,可以搜索产品列表并将它们存储在数组中。

我已经有了一个“产品”类,可用于获取特定产品的详细信息。

这是我的代码:

class Product {

    public $name;
    public $price;
    public $description;

    public function getProductById ($id) {

        $sql = 'SELECT name, price, description FROM product WHERE id = ' . $id;

        $row = /* MySQL functions here to execute SQL statement and get a matching row */

        $this->name = $row['name'];
        $this->price = $row['price'];
        $this->description = $row['description'];
        return TRUE;
    }
}

class Search {

    public $results;
    public $totalResults;

    function __construct() {
        $this->results = array ();
        $this->totalResults = 0;
    }

    public function doSearch ($name) {

        $sql = 'SELECT id FROM product WHERE name LIKE "%' . $name . '%"';

        $rows = /* MySQL functions here to execute SQL statement and get a list of matching product ID's */

        foreach ($rows as $row) {
            $product = new Product;
            $product->getProductById ($row['productid']);
            $this->results[] = $product;
        }
        return TRUE;
    }
}

$search = new Search;
$search->doSearch ('Fresh Flowers');

上述问题是doSearch方法中的每个匹配记录都将在getProductById方法中执行查询。如果有100个匹配的产品,则会在Product类中执行100个单独的查询。

但是,如果我使用单个查询直接在doSearch方法中获取产品,那么这将完全绕过Product类。

当“产品”是一个对象时,编写一个可以返回“产品”对象列表的搜索类的最合适的方法是什么,而不会产生我上面所做的开销?

4 个答案:

答案 0 :(得分:1)

将一个构造函数添加到Product类中,该类将名称,价格和描述作为参数(或一个assoziative数组),用必要的值填充对象,并将数据库查询解耦。

doSearch中,您可以创建一个SELECT,它不仅会从产品表中获取ID,还会获取所有相关字段,并使用new Product($name, $price, $description)或{立即创建已填充的产品对象{1}},不为每个产品调用new Product($row)

答案 1 :(得分:0)

使用数据库中的数据创建一个用Product填充实例的类。

然后,类可以根据获取的数据量创建Product类的一个或多个实例。

结论:从getProductById课程中提取Product并将其放在其他位置。它是一种专门的方法,只填充一个实例。

答案 2 :(得分:0)

首先抓住你想要的东西。

public function doSearch ($name) {

        $sql = 'SELECT id, name, price, description FROM product 
           WHERE name LIKE "%' . $name . '%"';

// now just return the array    

}

或使用PDO将结果集作为对象返回。

$result->setFetchMode(PDO::FETCH_INTO, new animals);

如下所述:How can I simply return objects in PDO?

答案 3 :(得分:0)

您的Product类不应该对数据库有任何了解。它应该包含代表产品的值,仅此而已。从本课程中提取处理数据库的所有内容。

搜索产品是访问产品列表的一种方法。您的下一课应该是产品清单。只有在访问单个产品时,您才不必处理列表,但这可能不像您想象的那么频繁。

好的,您拥有产品和产品列表,现在可以前进一步并添加数据库访问权限。你需要一个类来处理给你一个产品(当按id搜索时)和产品列表(当用一些文本或其他东西搜索时)。只有这个类允许您处理访问数据库所需的查询。每个查询的结果集可以直接在“产品列表”类中使用,可能是通过继承通用“产品列表”类中定义的所有内容并添加处理数据库结果。

所以最后你会得到:

Product -> ListOfProducts -> ProductDatabase -> DatabaseAccessLayer