PHP Nesne Uzatma Soru

2 Cevap php

Aşağıdaki gibi Yani bir öğe sınıf vardır:


class Item
{
    private $db;
    private $data = array(
    	'AltItem1' => null,
    	'AltItem2' => null,
    	'BaseUOM' => null,
    	'Category1' => null,
    	'Category2' => null,
    	'Category3' => null,
    	'Category4' => null,
    	'Iden' => null,
    	'IsHCS' => null,
    	'ItemDesc' => null,
    	'ItemNmbr' => null,
    	'ItemType' => null,
    	'MSDS' => null,
    	'NoteText' => null,
    	'NonStock' => null,
    	'PrcLevel' => null,
    	'TipPrice' => null,
    	'DTM_UpdType' => null,
    	'DTM_UpdDateTime' => null,
    	'DTM_DownloadDateTime' => null,
    	'DTM_UploadDateTime' => null
    );

    public function __construct(mysqli $db, $id = null){
    	$this->db = $db;

    	if(!empty($id)){
    		$id = (int)$id;
    		$this->populate($id);
    	}
    }

    public function __get($key)
    {
    	if(array_key_exists($key, $this->data)){
    		return $this->data[$key];
    	}
    	error_log("Invalid key '$key'");
    	return null;
    }

    public function __set($key, $value)
    {
    	if(array_key_exists($key, $this->data)){
    		$this->data[$key] = $value;
    		return true;
    	}
    	return false;
    }

    public function populate($id)
    {
    	$sql = sprintf(
    		"SELECT %s FROM ItemMaster WHERE id = ?",
    		implode(", ", array_keys($this->data))
    	);

    	$stmt = $this->db->stmt_init();
    	$stmt->prepare($sql) or die ("Could not prepare statement:" . $stmt->error);
    	$stmt->bind_param('i', $id);
    	$stmt->execute() or die('exec');
    	$stmt->store_result();
    	if($stmt->num_rows == 1)
    	{
    		$params = array();
    		foreach($this->data as $key => $val){
    			$params[] = &$this->data[$key];
    		}

    		call_user_func_array(array($stmt, 'bind_result'), $params);
    		$stmt->fetch();
    		$return = true;
    	}
    	else{
    		user_error("No rows returned for id '$id'");
    		$return = false;
    	}
    	return $return;
    }
    public function insert()
    {	
    	$params = $this->data;
    	$values = array();

    	foreach($params as $param){
    		$values[] = "?";
    	}

    	$sql = sprintf(
    		"INSERT INTO recurrence (%s) VALUES (%s)",
    		implode(", ", array_keys($params)),
    		implode(", ", $values)
    	);

    	$stmt = $this->db->stmt_init();
    	$stmt->prepare($sql) or die ("Could not prepare statement:" . $stmt->error);

    	$types = str_repeat("s", count($params));
    	array_unshift($params, $types);
    	call_user_func_array(array($stmt, "bind_param"), $params);

    	$stmt->execute();

    	$stmt->store_result();
    	$result = $stmt->result_metadata();
    }
    public function update()
    {
    	$sql = "UPDATE recurrence SET ";
    	$params = array();
    	foreach($this->data as $key => $value){
    		$params[] = "$key = ?";
    	}
    	$sql .= implode(", ", $params) . " WHERE id = ?";

    	$stmt = $this->db->stmt_init();
    	$stmt->prepare($sql) or die ("Could not prepare statement:" . $stmt->error);

    	$params = $this->data;
    	$params[] = $this->data['id'];
    	$types = str_repeat("s", count($params));
    	array_unshift($params, $types);
    	call_user_func_array(array($stmt, "bind_param"), $params);

    	$stmt->execute();

    	$stmt->store_result();
    	$result = $stmt->result_metadata();
    } 

    }

Benim soru hangi veri yapısı ile bende bir şekilde bu sınıfını genişletmek için en iyi yol olurdu? Ben temelde bir alışveriş sepeti bir öğe için başka bir sınıf istiyoruz. Bu yüzden bazı ekstra alanlar vb miktar, sepeti kimliği olacağını Veya sınıfını genişleterek olmadan bunu yapmak için daha iyi bir yolu var mı?

Bir başka not, ben başka bir değişken $ fiyat şu veritabanında doğrudan saklamak değil söylüyorlar. Yani bu bir ortak değişken yapmak, ama ben yardımcı yöntemler ben olmaz erişmek için yapmak zorunda kalacak? Bu durum buysa, benim $ data dizi öğesinin bu tip en iyi çözüm nedir?

Şimdiden teşekkürler.

2 Cevap

Seni yapıyor olabilir özel $data değişkenin kullanımı ne tür% 100 emin değilim, bu yüzden burada benim eğilimi biraz daha farklı bir yaklaşım olacaktır.

Bunun yerine nesnenin tek bir özel değişkenin içindeki tüm veri alanlarını gruplama, ben özel bir değişken kendisi, yani her alanı yapmak istiyorum:

class Item
{
    private $db;
    private $AltItem1;
    private $AltItem2;
...
etc.

Eğer sade bir kamu üyesi gibi alanları bildirebilirsiniz gibi bu hemen yanı kamuya açık veri alanlarını sahip sorununuzu çözecektir. ... Sadece $this->price Onları aracılığıyla erişebilir Kamu üyeleri bir alıcı ve bir ayarlayıcı gerekmez, bu yüzden bu konuda endişelenmenize gerek olmazdı (dahili), veya $item->price (harici). Sana bazı kod kaydeder. Ve yapmanız gereken istediğiniz tüm (4) [$this->$$key yerine {set olacaktır olarak, tüm yeni özelliklerini ayarlamak için populate() fonksiyonu hızlı bir değişiklik olacağını }].

Hatta nesnenin dışından özel $data üyesine erişmek mümkün istedikleri gibi Şimdi, __set() ve __get() sizin kullanımı ile görünüyor. Eğer her alan Özel de ayrı ayrı ilan alarak bu devam edemez hiçbir neden yok. __set() ve __get() tam olarak aynı şekilde çalışacaktır, sadece, yani küçük bir ayar gerekir:

public function __get($varname)
{
    if ($this->$varname !== null) return $this->varname;
    error_log("Invalid key '$key'");
    return null;
}

Eğer $data özelliğini geçersiz isterseniz kendi bütünlüğü içinde tüm alanları redeclare zorunda değilsiniz, çünkü son bir bonus olarak, sınıfını genişleterek, daha kolay olur. Sadece yeni özel üye olarak çocukların yeni alanlar ekleyin.

Yani hayatınızı kolaylaştırır eğer ben emin değilim, ama bu benim yaklaşım olacağını düşünüyorum.

Eğer özelliklerini gerekiyorsa, ben size çok ama mantık açısından yardımcı olamaz:

Görünümünün tamamen nesne yönelimli tasarım açısından, ben bu en iyi öğeleri izlemek için bir sepet sınıfı oluşturarak çözüldü düşünüyorum. Uygun bir tür listesi için temelde bir sarıcı sınıf olabilir (dile özgü ve ben çok PHP = P bilmiyorum).

Ben bir öğe de öyle sepeti takip yapmak için belirli bir neden görmüyorum - çoğu durumda, cart izlemek zorunda daha mantıklı. (Gerçek dünya modelleme açısından: öğeler olabilir sepeti takip yoksa veya olmayabilir Nah Ama arabaları temelde öğeler için sadece kaplar mı.).

I'm not quite sure what you're asking in your second question -- could you elaborate, please? Sorry I can't be of more help.

David