Düzgün php diğer sınıflarda dersleri kullanıyor?

3 Cevap php

Bu uzun zaman önce birisi sordu olmalıdır.

Başka bir sınıf içindeki diğer sınıfları kullanmak için en iyi yolu nedir?

Örneğin, ben bir uygulama sınıfı söylüyorlar sağlar:

class Application
{
    public function displayVar() {
        echo 'hello world';
    }
}

ve bir veritabanı sınıfı

class Database
{
    // connects to db on construct
    public function query() {
        // queries db
    }
}

Şimdi, ben db sınıfından bir işlevini kullanan benim uygulama sınıfı bir işlev eklemek istiyorum

class Application
{
    public function displayVar() {
        echo 'hello world';
    }
    public function getVar() {
        global $db;
        $sql = foo;
        $db->query($sql);
    }
}

o halde ben var

$db = new Database();
$app = new Application();
$app->getVar('var');

Bunu yapmanın iyi bir yolu var mı? Gerçekten ne arıyorum bunu yapmanın standart bir yolu değil, bu arma başka bir yoludur.

3 Cevap

Yapmanın yolları bir çift vardır. Global değişkenler kesinlikle bir şekilde ve en çok üzerine aşağı baktı. Bir Singleton oluşturabilir ve veritabanı erişimi gereken tüm diğer sınıflar bu tekiz çağırıyoruz olacaktır.

final class Database {
    private static $connection;

    public static function getInstance() {
        if(self::$connection == NULL) {
            self::$connection = // init your database connection
        }
        return self::$connection;
    }
}

Ve ihtiyacı neyse sınıf bu veritabanı bağlantı nesnesini kullanın.

class Application {
    public function displayVar() {
        echo 'hello world';
    }
    public function getVar() {
        $db = Database::getInstance();
        $sql = foo;
        $db->query($sql);
    }
}

Bu bir başlangıç ​​ve global değişkenleri kullanmanın ötesinde bir büyük adım için tüm iyi olduğunu, ancak Dependency Injection ile daha iyi yapabilirim. Bağımlılık Enjeksiyon bir sınıf gibi sizin örnekte veritabanı bağlantısı gibi herhangi bir dış bağımlılıkları, varsa, açıkça onun kurucu muhtaç sınıf veya bir yönteme olanlar geçmek basit bir kavram. Yani yeni kod Jonathan'ın çözüm gibi bir şey olmazdı. Bağımlılık enjeksiyon kullanarak önemli bir avantajı kolayca sahte bir nesne ile bu gerçek bir veritabanı nesnesini değiştirmek ve ihtiyacı her kim geçebilir birim test bulunmaktadır.

class Application {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    public function displayVar() {
        echo 'hello world';
    }

    public function getVar() {
        $sql = foo;
        $this->db->query($sql);
    }
}

Küçük projeler için, kolayca kendiniz yapabilirsiniz. Büyük projeler için, çeşitli DI frameworks available for PHP vardır

Söz sınıfını gereken her PHP dosyası sınıf dosyası (veya autoinclude kurmak) içerir. Gerektiği gibi Sonra örneğini.

Eğer bir nesnenin bir "ortak" örneği olması gerekiyorsa, Singleton ve Factory desenleri bakabilirsiniz:

Singleton Pattern Factory Pattern

$db sizin Application sınıfının bir özelliği olabilir. $this->db - bir örneği içinde kendisine herhangi bir başvuru Application $this ile yapılabilir olacaktır

class Application {

  private $db = null;

  public function setDB($name) {
    $this->db = new Database($name);
  }

}