Nasıl nesnelerin koleksiyonları ile çalışır?

4 Cevap php

Ben onun temel düzeyde OOP paradigma almak düşünüyorum ama ben bir veritabanındaki kayıtları arama için doğru yolu kavramsallaştırma bir sabit zaman yaşıyorum. Ben gerçekten çok ben böyle düşünüyorum OOP alamadım çünkü bu şüpheli ...

Bu nesneler için iyi adaylar bir yeri vardır, çünkü ben yazmaya çalışıyorum uygulama bir alışveriş sepeti. Ben çalışıyor olacağım nesne (evet, bu çok ilkel) bir üründür.

<?php
	class Product
	{
		public $id = 0;
		public $name = '';
		public $price = 0;

		function __construct($id)
		{
			// if $id exists try to retrieve
			// a product with $id
			// else create a new product
			// and set $this->id
		}
	}

	$product = new Product();
	echo $product->name;
?>

Kolay yeterli. Ama şimdi (bir arama sonuçları sayfası için) birden fazla ürün aramak istiyorum ve bunu işlemek için nasıl emin değilim.

Benim eğim bazı girdi alır ve sadece ürün kimlikleri listesini döndüren bir SQL sorgusu gerçekleştirir başka bir sınıf yazmak için. Ben bu sonuçları döngü sonra olur ve her biri için bir ürün nesnesi oluşturun. Ben nesnelerin dizi döngü sonra olabilir ve benim arama sonuçları sayfasını oluşturmak.

Neden ama bu sadece doğru yol gibi gelmiyor emin değilim. Önce ben bir sorgu yapıyorum sadece ürün kimlikleri bir listesini almak ve sonra her ürünün verilerini almak için daha fazla sorgular yapmak için çünkü çok fazla iş gibi görünüyor. Sadece ihtiyacınız olan tüm veri döndü bir sorgu yaptım eğer çok daha hızlı olurdu.

Yapılacak doğru şey nedir? Belki de başka bir şey?

4 Cevap

Veritabanı farkında olmayan bir ürün sınıfını yaz (inanıyorum ama zor ürünler can ;) bir veritabanı olmadan var) ve bir veritabanı sonucu gelen ürün nesneleri oluşturabilirsiniz bir sınıf.

Bir nesne yönelimli bir uygulama için bir veritabanından Haritalama önemsiz değildir. Orada bu yaklaşım için farklı yolları vardır, ancak basit bir strateji, bir varlık sınıfı (Ürün) ve bir ağ geçidi sınıf (farklı şeyler denilebilir, ancak tipik ProductGateway veya Ürün bulma) sahip olmaktır. Geçidi sınıfı veritabanına erişimi vardır ve knows nasıl varlıkları almak ve başlatmak için. Aynı sınıfı da geri veritabanına nesne haritası nasıl bilemez.

Örneğin:

class ProductGateway {
  function getProductById($id) {
    $result = $this->db->query("select * from products where id = ?", $id);
    return new Product($result->next());
  }
  function save($product) {
    if ($product->getId()) {
      return $this->update($product);
    } else {
      return $this->insert($product);
    }
  }
  ...
}

Nokta size uygulama seviyesi kodu ürün bir veritabanından ya da değil geldiyse bilmek gerek olmamasıdır. Sadece varlık nesnesini değiştirir ve sebat ile başa çıkmak için ağ geçidi için bırakır.

Sana doğru çizgiler üzerinde düşünüyoruz düşünüyorum - bir şey olsa, neden eşleşen ürünlerinin dizi (veya liste) dönüş, sadece kimlikleri dönmek.

Nasıl sorgu yöntemleri, parametreleri ürünlerin dönüş türü Ürünlerin bir koleksiyon olma tanımları olmak olan bir Ürün bulma hakkında.

Daha sonra Dolayısıyla Ürünün kendisi db hakkında çok az ya da hiçbir şey bilmiyor ürünleri vb silme, Ürün bulma da (DB ekleme) ürünler oluşturmak için sorumluluk alabilir görebilirsiniz. Ürün bulma sonra bu ProductKeeper veya ProductHome gibi biraz farklı bir ad alabilirsiniz.

Eğer ürünlerin yanı sıra epeyce varlıkları varsa, sonra onların "Bekçileri" önce uzun bir sebat çerçeve ile sonuna kadar, ortak kod korkunç bir şey olduğunu görebilirsiniz. least one already php için, ben ona bir göz önermek de var gibi görünüyor.

OOP'deki veritabanları ile başa çıkmak için halihazırda varolan çerçeveler kullanarak yanaşmayacaklardır Dont. Zend_Db farklı kullanım yöntemleri, çeşit yukarıda açıklandığı gibi en önemlisi Tablo Geçidi / Satır Geçidi yöntemi vardır. TableGateway sorguları yapmak ve Satırları dönmek için tasarlanmıştır. Satırlar Tek bir satır temsil eden ve bağımsız olarak manipüle edilebilir.

Birçok satır için bir sorgu, tablo (veya katılmak bazı kompleks halinde bile 'sanal' tablosu) temsil eden ayrı bir sınıf yapıyorsanız bu tablonun endişelerini ve bireysel satırları ayrı tutmak için temiz yoldur.