0

私は簡単なものを持っています:私はPHP Objectの初心者であり、すべての製品を含む製品テーブルを持っています。

製品のクラスもあります(インスタンスを製品のすべてのパラメーターで満たすコンストラクターを使用)。

すべての製品のリストが必要だとしましょう。製品のリスト用に別のクラスを作成しますか、それとも製品クラスの新しいインスタンスを作成する関数を作成しますか?

クラスクエリとまったく同じクエリを実行する必要がある場合、それは役に立たないので、私は今それの利点を実際には得ていませんか?

ヒントをありがとう!

アップデート

皆さんありがとう!それは私にとってまだかなり複雑ですが、これが私があなたのアドバイスに従おうとして(本について話している)したことです。

DAOを作成しました。このDAO内には、本のリストまたは1冊の本のいずれかを返す2つの静的関数と、本オブジェクトを作成する1つの静的関数があります。

この方法では、まだ2つのクエリがあります(1つはリスト用、もう1つは1冊の本用)。私はこれが間違っていると感じていますが、助けていただければ幸いです:)

class bookDAO {

    public static function getBooks() {
        $books = array();
        $db = databaseConnection::getInstance();
        $query = $db->query("SELECT * FROM books");
        while($row = $query->fetchObject()) {
            $book = self::createBookFromRow($row);
            $books[] = $book;
        }
        return $books;
    }

    public static function getBook($id){
        $db = databaseConnection::getInstance();
        $query = $db->prepare("SELECT * FROM books WHERE id=:id");
        $query->execute(array(":id"=>$id));
        $row = $query->fetchObject();
        $book = self::createBookFromRow($row);
        return $book;
    }

    private static function createBookFromRow($row) {
        $book = new book($row);
        return $book;
    }

}
4

4 に答える 4

3

この場合、オブジェクトの配列を作成するのが一般的です。

例えば:

$products = array();
foreach($results as $result) {
  $products[] = new Product($result);
}
print_r($products);
于 2012-10-02T19:05:22.887 に答える
2

ProductDAOあなたの Product クラスは、クエリを実行することを想定していません。それを DAO などのクラスに分けます。

class ProductDAO
{
  function static getProducts()
  {
     //Your query here: PDO, MySQLi, MySQL etc
    $products = array(); //to store array of products

    while($row = mysql_fetch_assoc($result))
    {
       $product = createProductFromRow($row);

       $products[] = $product;
    }

    return $products;
}

   private static function createProductFromRow($row)
   {
   $product = new Product();
   $product->setId($row["id"]);
   $product->setName($row["Name"]);
   //etc

   return $product; 
   }
}

あなたのページから

  $products = ProductDAO::getProducts();

  foreach($products as $p)
  {
     echo ($p->getName() + '<br />');
  }
于 2012-10-02T19:08:26.893 に答える
2

単純に配列を追加できます。または、productslist にいくつかのメソッドを追加したい場合は、次のようなものを実装できます。

class Products
{
    private $productFactory;

    private $products = array();

    public function __construct(ProductFactory $productFactory) {
        $this->productFactory = $productFactory;
    }

    public function addProduct($product)
    {
        $this->products[] = $this->productFactory->build($product);
    }

    public function addProducts($products)
    {
        foreach ($products as $product) {
            $this->addProduct($product);
        }
    }

    // do soemthing with all products
    public function changeProducts()
    {
        foreach($this->products as $product) {
            $product->changeSpec('new spec value');
        }
    }
}

class Product
{
    private $someSpec;

    public function __construct($spec)
    {
        $this->someSpec = $spec;
    }

    public function changeSpec($spec) {
        $this->someSpec = $spec;
    }
}

class ProductFactory
{
    public function build($spec) {
        return new Product($spec);
    }
}

// build the productslist object
$productFactory = new ProductFactory();
$products = new Products($productFactory);
$products->addProducts(array(
    'some spec of product1',
    'some spec of product2',
));

手動で製品を追加することに注意してください。ただし、これは永続的なストレージ メカニズム (データベースなど) からのレコードセットである可能性もあります。または、データベースにアクセスして製品を取得するクラスを注入することをお勧めします。Product/Productsクラス内でクエリを実行しないでください。その場合、何か (データベース) を密結合しているため、テストが非常に難しくなります。それに加えて、 SRPにも違反しています。

Productクラスの新しいインスタンスを作成するためのファクトリを作成したことに注意してください。Productこの方法では、クラスをクラスに密結合していませんProducts。これにより、単体テストを行う場合に備えて、Product クラスのモックがはるかに簡単になります。

アップデート

Productsクラスでできるもう 1 つのことは、必要に応じて製品をループすることもできるように、Iteratorインターフェイスを実装させることです。

于 2012-10-02T19:15:01.213 に答える
1

すべての製品参照が保存される製品クラス

class Products {

    static private $store = array();

    static public function save(Product $object)
    {
        self::$store[] = $object;
    }

    static public function getAll()
    {
        return self::$store;
    }

}

すべての Product 参照を Products クラスに保存する

最も簡単な方法は、Product コンストラクターで行うことです。

# your Product class
class Product {

    public function __construct()
    {
        # your stuff here..

        # save reference of current Product to the Products
        Products::save($this);
    }

}

製品の初期化

これはテスト用です。ここでロジックを使用して、製品オブジェクトを初期化します。

new Product;
new Product;
new Product;

すべての製品をループ

foreach (Products::getAll() as $product) {
    var_dump($product);
}
于 2012-10-02T19:17:24.317 に答える