Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.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 类从另一个类创建对象,但开销较小_Php_Class_Object - Fatal编程技术网

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

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

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

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

这是我的密码:

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的答案标记为正确答案,因为它对给出的示例给出了最直接的答案。我尝试了你的建议,但我的头脑还没有完全清醒过来,但这可能取决于我的专业水平。