Php 类从另一个类创建对象,但开销较小
我试图做的是编写一个“搜索”类,它可以搜索产品列表并将它们存储在数组中 我已经有了一个“product”类,可以用来获取特定产品的详细信息 这是我的密码:Php 类从另一个类创建对象,但开销较小,php,class,object,Php,Class,Object,我试图做的是编写一个“搜索”类,它可以搜索产品列表并将它们存储在数组中 我已经有了一个“product”类,可以用来获取特定产品的详细信息 这是我的密码: class Product { public $name; public $price; public $description; public function getProductById ($id) { $sql = 'SELECT name, price, description
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方法中获取产品,那么这将完全绕过产品类
当“产品”是一个对象时,最合适的方法是编写一个搜索类,该类可以返回“产品”对象的列表,而不需要我上面所做的工作的开销?创建一个类,用数据库中的数据填充
产品的实例
然后,该类可以创建产品
类的一个或多个实例,具体取决于提取的数据量
结论:从产品
类中提取getProductById
,并将其放在其他地方。这是一种只填充一个实例的专门方法。创建一个类,用数据库中的数据填充产品的实例
然后,该类可以创建产品
类的一个或多个实例,具体取决于提取的数据量
结论:从产品
类中提取getProductById
,并将其放在其他地方。它是一种只填充一个实例的专门方法。将构造函数添加到产品
类中,该类将名称、价格和描述作为参数(或关联数组),以使用必要的值填充对象,与数据库查询分离
在doSearch
中,您可以创建一个SELECT
,它不仅可以从products表中获取ID,还可以从products表中获取所有相关字段,并使用new product($name,$price,$description)
或new product($row)
立即创建填充的产品对象,不为每个产品调用getProductById
。向product
类添加一个构造函数,该类将名称、价格和描述作为参数(或一个关联数组),以使用与数据库查询解耦的必要值填充对象
在doSearch
中,您可以创建一个SELECT
,它不仅可以从products表中获取ID,还可以从products表中获取所有相关字段,并使用new product($name,$price,$description)
或new product($row)
立即创建填充的产品对象,无需为每种产品调用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);
正如这里所讨论的:只要在第一时间抓住你想要的东西
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);
正如这里所讨论的:您的产品类不应该知道关于数据库的任何信息。它应该包含表示产品的值,仅此而已。从这个类中提取所有处理数据库的内容
搜索产品是访问产品列表的一种方法。你的下一节课应该是一个产品列表。只有在访问单个产品时,您才不必处理列表,但这可能比您想象的要少
好的,您已经有了产品和产品列表,现在可以向前一步添加数据库访问。您需要一个类来处理提供一个产品(当按id搜索时)和产品列表(当按文本或其他内容搜索时)的问题。只有此类允许您处理访问数据库所需的查询。每个查询的结果集可以直接在“产品列表”类中使用,可能是通过继承常规“产品列表”类中定义的所有内容并添加处理数据库结果的操作
因此,最终您将拥有:
Product->ListOfProducts->ProductDatabase->DatabaseAccessLayer
您的产品类不应该知道任何关于数据库的信息。它应该包含表示产品的值,仅此而已。从这个类中提取所有处理数据库的内容
搜索产品是访问产品列表的一种方法。你的下一节课应该是一个产品列表。只有在访问单个产品时,您才不必处理列表,但这可能比您想象的要少
好的,您已经有了产品和产品列表,现在可以向前一步添加数据库访问。您需要一个类来处理提供一个产品(当按id搜索时)和产品列表(当按文本或其他内容搜索时)的问题。只有此类允许您处理访问数据库所需的查询。每个查询的结果集可以直接在“产品列表”类中使用,可能是通过继承常规“产品列表”类中定义的所有内容并添加处理数据库结果的操作
因此,最终您将拥有:
Product->ListOfProducts->ProductDatabase->DatabaseAccessLayer
阅读sql中的连接是什么。@rambocoder连接在这里几乎没有用处。哦,我没有注意到两个查询中使用的是同一个表。阅读sql中的连接是什么。@rambocoder连接在这里几乎没有用处。哦,我没有注意到两个查询中使用的是同一个表。我将Wolfgang Stengel的答案标记为正确答案,因为它对给出的示例给出了最直接的答案。我尝试了你的建议,但我的头脑还没有完全清醒过来,但这可能取决于我的专业水平。