Bu kötü Nesne PHP Odaklı?

4 Cevap php

Ben başlık, kenar çubuğu ve altbilgi içeren bir görüntü nesnesi oluşturduk:

class Display {
    protected $framework;
    public $mysql;
    public function __construct() {
        $this->mysql = new MySQL();
        $this->framework .= $this->header();
        $this->framework .= $this->body();
        $this->framework .= $this->sidebar();
        $this->framework .= $this->footer();
    }
    private function header (){ /* blah */ }
    private function body (){  }
    private function sidebar (){ /* blah */ }
    private function footer (){ /* blah */ }
    public function displayPage(){
        print $this->framework;
    }
}

Her sayfada ben vücut için kodu ile, görüntüleme nesnesini genişleten bir nesne yarattık:

class IndexPHP extends Display {
    public function body(){
        $this->user = new User();
        return '<div class="body">Hello ' . $this->user->getName() . '</div>';
    }
}
$page = new IndexPHP();
$page->displayPage();

Ben çok fazla nesneleri iç içe bir sorun yarattı mı? Örneğin, kullanıcı nesne, nasıl ben zaten başlatılmış MySQL nesneye erişmek mi?

class User {
    protected $name;
    public function __construct() {
        $this->id = /* MySQL object query here */
    }
}

4 Cevap

Verdiğin yaklaşımla sorunu size ilkeleri "güçler ayrılığı" her türlü takip etmiyorsun ki. Görünen nesne ona bağlanmak için nasıl mantık ile birlikte, içinde bir veritabanı var; bu muhtemelen en iyi yaklaşım ("Tanrı nesne") değil. Bu sunulacak MVC sizin modeli (veritabanı) hakkında bir şeyler bilen bir sınıf var (model-view-controller) ilkeleri, nesnelere modeli dönüştürmek için nasıl bilir başka takip etmek iyi bir fikir olabilir (kontrolör) , ve aslında onun CSS iyilik (görünüm, sık sık sadece bir PHP şablon dosyası) ile tüm verileri gösterir ki üçüncü.

Ben Varolan MVC çerçevesinde bakmak tavsiye ederim - Symfony, Zend, CakePHP - I (http://qcu.be), diğerleri vardır QCubed kullanın. Hepsi size sonuçta Düzeltilebilirlik sonuçları temiz kodunuzu ayırmak için harika bir yol sunar.

Örneğin, kullanıcı nesne, nasıl ben zaten başlatılmış MySQL nesneye erişmek mi?

Siz yapıcı geçmek:

class User {
  protected $name;
  public function __construct($mysql) {
    $this->id = $mysql->something();
  }
}

Eğer çocuk derslerinde işlevleri geçersiz (örneğin sizin IndexPHP sınıf geçersiz kılmaları body()) Onları protected yerine private yapmak gerekir.

Ayrıca, sadece yapıcı, atama değerler gibi, basit şeyler yapmak için iyi bir uygulamadır. Sizin Display yapıcı o displayPage için inşaat çalışmalarını taşımak için daha iyi olabilir sınıfındaki tüm çalışmaları yapar:

public function __construct(MySQL $mysql) {
    $this->mysql = $mysql;
}

public function displayPage($rebuild=false) {

    if(empty($this->framework) || $rebuild) {
        $this->framework = $this->header();
        $this->framework .= $this->body();
        $this->framework .= $this->sidebar();
        $this->framework .= $this->footer();
    }
    print $this->framework;
}