2012-06-25 20 views
8

Nesne yönelimli PHP'de çok fazla kod yaptım, ama şimdiye kadar bütün sınıflarım "tekil", sanırım onu ​​arayabilirsin. Bir sınıfı genişletmek için (yinelenen koddan kurtulmak için) birkaç sınıf değiştirme (5 veya daha fazla özdeş yönteme sahip) durumundayım. Birkaç sorunla karşılaşıyorum.PHP - Sınıfı Genişletme

Bir ana sınıftaki bir yönteme erişmeye çalışıyorum, ancak sorunu görebilirsiniz.

Veli sınıfı:

class DatabaseObject { 

    public static function find_all() { 
     return self::find_by_sql("SELECT * FROM " . self::$table_name); 
    } 
} 

Çocuk Sınıfı:

class Topics extends DatabaseObject { 

    protected static $table_name = "master_cat"; 
    protected static $db_fields = array('cat_id', 'category'); 
    public $cat_id; 
    public $category; 

    } 

Kod php/html dosyasından bu tablodan tüm bilgileri erişmeye çalışırken: Gördüğünüz gibi

$topics=Topics::find_all(); 

foreach($topics as $topic): 
    echo $topic->category; 
endforeach; 

Kodun çoğu, yeni şeyler yapma yoluna dahil edilmedi. Artık yeni şeyler yapmama neden olan self :: $ table_name değerini değiştirmem gerekiyor. Bu nesneyi genişleten yaklaşık 5 Sınıfım olacak, bu yüzden kodlamanın en iyi yolu, farklı tablolara tek bir yöntemle erişebilmem için (bu tam find_all() yöntemini 5 farklı sınıfta içermekten ziyade)

+0

OOP ve özellikle PHP'de uygulanma şekli hakkında daha fazla bilgi edinmenizi öneririz. Bir çalışma kodu size gerçek sorunu çözmeyecektir. – Adi

+11

Aksine, başkalarının kodlarını öğreniyorum. Belki de şimdi birisinin soruyu gerçekten yanıtlamasını bekleyeceğim. – KickingLettuce

+0

"Diğer insanların kodlarından öğrendim" diye sık sık öğrenmek, çok iyi çalışmadığını. Kitap okumayı düşünmelisin. – KingCrunch

cevap

18

sen mentioned below olarak bağlayıcı geç statik deneyebilirsiniz ya da tekil çözümü de çalışması gerekir.

<?php 
abstract class DatabaseObject { 
    private $table; 
    private $fields; 

    protected function __construct($table, $fields) { 
    $this->table = $table; 
    $this->fields = $fields; 
    } 

    public function find_all() { 
    return $this->find_by_sql('SELECT * FROM ' . $this->table); 
    } 
} 

class Topics extends DatabaseObject { 
    private static $instance; 

    public static function get_instance() { 
    if (!isset(self::$instance)) { 
     self::$instance = new Topics('master_cat', array('cat_id', 'category')); 
    } 

    return self::$instance; 
    } 
} 

Topics::get_instance()->find_all(); 
+0

+1'e ışık tutuyoruz ve her şeyi yapıyoruz (kitabı okuyalım) – Adi

+8

+1 sabrı için – Ibu

2

. PHP'de Late Static Binding kavramı içine Bu çağrıldı sınıftan statik işlev veya sabit erişmesini sağlar