Nesne Tabanlı Programlama, uzanan özellikleri

2 Cevap php

Tamam ben PHP örnek yayınlayacağız bu sadece bir PHP soru değil, ama ben PHP bu sorun var.

Örnek:

Ben üç sınıf, diyelim ki, data_abstract, kişi ve öğrenci var. Şimdi, bu nesnelerin her biri ile ilgili verilerin bir dizi var.

class person extends data_abstract
{
    protected $data; //name, gender, etc
}

class student extends person
{
    protected $data; //student_id, etc
}

Şimdi, örneğin, table_person, table_student, veritabanı tablolarından bu "veri" özelliğinin her varsayarak.

Örnekleme sonra biz get_class () fonksiyonu ile sınıf adı ayrıştırmak olacak ve ilgili tablolardan veri almak.

class data_abstract
{
    public function __construct()
    {
        $name = get_class($this);
        $table = 'table_' . $name;

       $this->data = DB->query('SELECT * FROM ' . $table); 
       //whatever DB constant is, 
       //I'm just trying to get all rows of data from the related table.
    }
}

Tamam, şimdi sorun, ben $ öğrenci tarafından öğrenci örneğini zaman = new öğrenci (); Yapıcı benim için table_student veri almak ve $ öğrenci-> veri koymak, ama ben table_person gelen veri almak ve bir nesnenin içine veri bu iki set koymak mümkün olmayacaktır olacak.

Başka bir sınıfını genişleterek, tüm yöntemleri (işlevler) genişletilmiş ve özelleştirilmiş (polimorfizm ile) var, ama nesnenin her düzeyde nitelikleri / özellikleri uzanan en azından bazı el yapımı olmadan, zor gibi görünüyor olabilir.

Bunu başarmak için soyutlama düzeyinde herhangi bir yolu var mı?

(Okuma için teşekkürler, ben soru daha net yaptık isterdim.)

2 Cevap

Ben de anlamak:

  • Eğer $ veri tüm DB veri istiyorum;
  • $ Veri tablo 'table_classname' verilerle beslemek gerekir;
  • $ Veri bu süreç ile veliler sınıfta yüklenmiş olması gerektiğini $ veri itibaren "miras".

Eğer veri besleme aşırı böylece bu durumda, $ veri beslenmesini yansıtmak gerekir. Ben şimdi bir çalışma örneği var, düzenlenebilir:

class DataAbstract // Using caps is much better for class name
{
    public function __construct()
    {
        $this->loadData();
    }

    public function loadData()
    {
        // don't use getclass on $this or $this will refer to the children
        $table = 'table_' . __CLASS__; 
        $this->data = array($table); 
    }
}


class Person extends DataAbstract
{

    public function __construct()
    {
        parent::__construct();
    }

    public function loadData()
    {
        parent::loadData();
        $table = 'table_' . __CLASS__;
        $this->data = array_merge($this->data, array($table)); 
    }
}

class Student extends Person
{
    public function __construct()
    {
        parent::__construct();
    }

    public function loadData()
    {
        parent::loadData();
        $table = 'table_' . __CLASS__;
        $this->data = array_merge($this->data, array($table)); 
    }
}

$c = new student();
print_r($c->data);

Çıkışlar

Array
(
    [0] => table_DataAbstract
    [1] => table_Person
    [2] => table_Student
)

BTW, PHP iç gözleme var unutmayın, bu size ihtiyacınız dinamik alanları ayarlamanızı sağlar: belki temizleyici bu büyük bir Array kullanarak.

Tüm alanların isimlerini bilmek koşuluyla, gibi bir şey yapabilirsiniz

function populate($data) // get the array from the DB
{
    $fieldList = get_class_vars($this); // get the filed list

    foreach ($fieldList as $key => $value)
    {
        $this->$key = $data[$key]; // feed the field one by one with the array
    }
}

Şahsen ben niteliği $tablename sürer ve tüm verileri yükler hangi bir koruma yöntemi veritabanı yükleme sınıf vereceğini. Sonra sınıfın constructor elle onu aramak, ve ebeveyn.

class Person 
{
    public function __construct() {
        $this - > loadData("Person");
    }
}

Class Student extends Person 
{
    public function __construct() {
        parent::__construct();
        $this - > loadData("Student");
    }
}

Şimdi, Student ve Person yüklenir dan Student, hem veri oluşturmak zaman. Eğer kullanırsanız array_merge() 2 veri dizileri birine birleştirilmiş olacak.

Bu tarz meselesi; refactor fazla çalışma - - Bazı insanlar şimdi iki şey tekrarlıyor söyleyerek bu critisise ederim ama veritabanı tasarımı (iyi bir şey) den ve ana çağrısı ile sınıf adları ve arayüzleri ayırımı vardır söyleyebilirim, kodu şimdi daha OO.