【问题标题】:class to create objects from another class, but with less overhead类从另一个类创建对象,但开销较小
【发布时间】:2012-11-24 18:59:57
【问题描述】:

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

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

这是我的代码:

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

当“产品”是一个对象时,编写一个可以返回“产品”对象列表的搜索类最合适的方法是什么?

【问题讨论】:

  • 了解join 在 sql 中的含义。
  • @rambocoder JOIN 在这里几乎没有用处。
  • 哦,我没有注意到两个查询都使用了同一个表。

标签: php class object


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    然后该类可以创建Product 类的一个或多个实例,具体取决于获取的数据量。

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

    【讨论】:

      【解决方案3】:

      一开始就抓住你想要的。

      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?

      【讨论】:

        【解决方案4】:

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

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

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

        所以最终你会得到:

        Product -> ListOfProducts -> ProductDatabase -> DatabaseAccessLayer

        【讨论】:

        • 我将 Wolfgang Stengel 的答案标记为正确答案,因为它对给出的示例给出了最直接的答案。我尝试了您的建议,但无法完全理解它,但这可能取决于我的专业水平。不过,我知道您的想法来自哪里,并希望进一步尝试您的想法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-23
        • 1970-01-01
        • 2016-07-24
        相关资源
        最近更新 更多