PHP: duruk sınıf yöntemleri mevcut veritabanı bağlantısı geçmek için?

2 Cevap php

Ben duruk sınıf yöntemleri bir dizi var. Ben de bir nesne değişkeni $ DB saklanan bir komut varolan bir veritabanı bağlantısı var. Nasıl bu statik sınıf yöntemleri onları sınıf yönteminin bir parametre olarak onları her zaman bu değişken geçmek zorunda kalmadan $ DB nesnesi kullanmasına izin ve diyorsunuz?

Örneğin, şu anda küresel bir, maalesef kullanmak için yaşıyorum:

class Foo {
  public static function Bar() {
    global $DB;
    return $DB->DSN_STRING;
  }
}

Ben bir şekilde yeniden kurmak o gerek kalmadan $ DB bağlantı alır bir rutin ile kendisini aramak için benim statik sınıf gerekir gibi. Bu örneği değil çünkü statik sınıf içine enjekte edemez.

Ben normal bir sınıfa statik sınıf geçmek ve benim $ Foo nesnesi örneğini Tabii ki sorun çözüldü. Ben daha sonra bir kamu değişken üzerinde bir ayarı olarak $ DB VAR enjekte edebilir. Ya $ DB VAR almak ve daha sonra $ Foo nesnesinin bir private var ayarlamak için genel bir yöntem ekleyin. Ya da, bir sınıf yapıcı $ DB VAR kabul ve $ Foo nesnesinin bir private var set yapın. Ama bütün 3 teknikleri Ben normal bir sınıfa statik sınıftan geçiş gerektirir.

Bazı insanlar bir Registry desen veya bir Singleton deseni (ben aynı şey mi? Emin değilim) diye bahsettiğimiz şey var. Bu ben verimli bu sorunu çözmek için gereken nedir?

En önemlisi şey insanların bu konuda kafayı çünkü "global $ DB" arama önlemek olmasıdır.

2 Cevap

Ben, ve, bunun için singleton deseni kullanmak yapardı. Ben sadece burada Database_Manager arayacağım bir sınıf kullanmak:

class Database_Manager
{
    private static $instance;
    private $db_connection;

    public static function getInstance()
    {
    	if (self::$instance == null) {
    		$className = __CLASS__;
    		self::$instance = new $className();
    	}
    	return self::$instance;
    }

    public static function initializeConnection($connectionInfo)
    {
    	$db = self::getInstance();
    	//call init functions.. connect to db, etc
            //save connection to $db->db_connection;

    }

    public static function getDb()
    {
    	$db = self::getInstance();
    	return $db->db_connection;
    }
}

Sen initializeConnection () çağrısı ile bir kez şeyler kurmak, ve sonra sadece out sonra gelen Database_Manager :: getDb () çağırabilirsiniz.

Bu yaklaşım hakkında güzel bir şey kolayca birden fazla veritabanı bağlantıları yönetmek için modifiye edilir, ve sadece hiç veritabanı başına bir bağlantınız var garanti konum olduğunu.

Ben böyle (yani en yukarıda bellekten kopyalanır) __ construct () fonksiyonu özel ilan gibi Singleton uygulama asıl meseleye, bazı sol dışarı unutmayın. Ben sadece genel yaklaşım göstermek istedim.

Ben bir Singleton yapmak için çalışıyoruz ne de işe yarayacağını düşünüyorum. Aksi takdirde zaten öğrendim gibi, son derece pahalı, 'küresel' anahtar sözcüğünü kullanmak zorunda yasak.