Sınıf veri mirası Önlenmesi

4 Cevap php

Ben bu yüzden böyle bir temel sınıf ile başlayan bir veritabanı soyutlama katmanı var:

class DB {
  function DB() {
    $this->host = "xxx";
    $this->db = "xxx";
    $this->user = "xx";
    $this->pass = "xx";
    $this->dbh = mysql_connect($this->host, $this->user, $this->pass);
    mysql_select_db($this->db);
    // etc
  }
}

class DBI extends DB {
  // etc
}

Çocuk sınıflar kimlik veritabanı kolu miras değil için şimdi isterim. Ben (DBI sınıfında) çalıştı:

    function DBI (){ 
        $this->host ='';
        $this->db ='';
        $this->user ='';
        $this->pass ='';
    }

Ama bu kolu öldürür; neden emin değil. Ayrıca çalıştı:

class DBI extends DB {
    var $host ='';
    var $db ='';
    var $user ='';
    var $pass ='';
}

hiçbir etkisi.

Ne yapmam gerektiğini sadece sınıf altoghether dışarı veritabanı bağlantısını hareket edilir Yani ben merak ediyorum? Sadece bir bağlantı ile sınıf dosyasını başlatmak ve onları bırakmak?

Görüşler?

4 Cevap

Sonunda basit yaklaşım, sadece sınıfların üzerinden bağlantı taşımaktır. Ben bağlantı ile sınıf dosyasını başlamak, sonra kolu $ bir sınıf niteliği DBH yapmadan tüm sınıflar için kullanılabilir durumdadır.

Sonra onları üye değişkenler yapmazlar

<?php
class DB
{
  var $dbh;

  function DB()
  {
    $this->dbh = mysql_connect( "xxx", "xxx", "xx" );
    mysql_select_db( "xx", $this->dbh );
    // etc
  }
}

class DBI extends DB {
  // etc
}

veya PHP5 geçmek ve onları özel hale

<?php
class DB
{
  private
      $host = "xxx"
    , $db   = "xxx"
    , $user = "xx"
    , $pass = "xx"
  ;

  protected $dbh;

  public function __construct()
  {
    $this->dbh = mysql_connect($this->host, $this->user, $this->pass);
    mysql_select_db( $this->db, $this->dbh );
    // etc
  }
}

class DBI extends DB {
  // etc
}

ve ben size mysql_select_db() çoklu bağlantı güvenli kalmak gibi fonksiyonlar için bağlantı kolu geçmek hatırlamak gerekmez ki.

EDIT!

Ama bu kolu öldürür; neden emin değil.

PHP Kurucular basamakla değil çünkü (üst sınıf 'yapıcısı dolaylı olarak adlandırılır değildir). Yani DBI bir örneğini oluşturduğunuzda DB::DB() otomatik olarak adlandırılır değil demektir. Yani açıkça yapmak zorunda. Yani bu başka bir seçenek sanırım ama gerçekten sevmiyorum

class DBI extends DB
{
  function DBI()
  {
    // Call the parent constructor
    parent::DB();

    // Now empty these member variables
    $this->host = '';
    $this->db   = '';
    $this->user = '';
    $this->pass = '';
  }
}

Neden yapıcısı üzerinden de veritabanı ayarlarını geçemiyor:

function DB($host, $db, $user, $pass) {
    $this->host = $host;
    $this->db = $db;
    $this->user = $user;
    $this->pass = $pass;
    $this->dbh = mysql_connect($this->host, $this->user, $this->pass);
    mysql_select_db($this->db);
}

Sonra yapabilirsiniz

function DBI() {
    parent::DB('xxx', 'xxx', 'xxx', 'xxx');
}

(PHP4 ve PHP5 hem de, ana yapıcı denilen olmayacak örtük tanıtıcısı DBI sınıfta "öldürüldü" nedeni budur,.. Baslatılması geçmez Ne really ihtiyaç olsa, PHP5'ta geçmek için :)

Eğer bir mülk miras bir çocuk sınıf istemiyorsanız, size özel olarak ilan edebilir. Bu sadece PHP 5 için çalışır:

class DB {

  private $host = "xxx";
  private $db = "xxx";
  private $user = "xx";
  private $pass = "xx";

  function DB() {
    $this->dbh = mysql_connect($this->host, $this->user, $this->pass);
    mysql_select_db($this->db);
    // etc
  }
}

Ancak, ben bu yolu tavsiye etmem. Veritabanı ayarları daha iyi kapalı bir yapılandırma dosyasında saklanır. Bu şekilde, bu uygulamalar arasında kodu yeniden kullanmak daha kolaydır.

Bu yapılandırma değişkeni config.php adında bir dosya içinde bir dizi olarak yapmak, ve sonra bunu gerektirir fonksiyonları küresel olarak bu diziyi kullanmak için hala çok yaygındır. Ancak, mümkün olduğunda globalleri uzak kalmak için de iyi bir fikirdir. Örneğin, orada bir yapılandırma sınıfı yönetmek için nasıl bazı iyi tasarımları vardır Zend_Config. Sen bunu nasıl yaptın bazı iyi fikir edinebilirsiniz.