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



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

我已经有了一个"产品"类,可以用来获取特定产品的详细信息。

这是我的代码:

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类。

当一个"产品"是一个对象时,写一个搜索类最合适的方式是什么?这个搜索类可以返回一系列"产品"对象,而不需要我上面所做的开销?

Product类添加一个构造函数,该类以名称、价格和描述为参数(或关联数组),以使用与数据库查询解耦的必要值填充对象。

然后,在doSearch中,您可以创建一个SELECT,它不仅从products表中获取ID,还可以获取所有相关字段,并立即使用new Product($name, $price, $description)new Product($row)创建填充的产品对象,而无需为每个产品调用getProductById

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

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

结论:从Product类中提取getProductById并将其放在其他地方。这是一种专门的方法,只填充一个实例。

只要从一开始就抓住你想要的。

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

正如这里所讨论的:如何在PDO中简单地返回对象?

您的Product类不应该知道任何关于数据库的信息。它应该包含代表产品的值,仅此而已。从这个类中提取所有与数据库有关的内容。

搜索产品是访问产品列表的一种方式。那么你的下一堂课应该是一份产品清单。只有在访问一个产品时,你才不必处理列表,但这可能比你想象的要少。

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

所以最终你会得到:

Product -> ListOfProducts -> ProductDatabase -> DatabaseAccessLayer

最新更新