erişim global değişken gibi statik sınıf değişkeni

3 Cevap

Diyelim ki aşağıdaki sınıf var diyelim:

class SQLMapper{
    static find_user_by_id($id){
        //sql logic here, using the $_DATABASE global to make a connection
    }
}

Ben sadece diyebiliriz:

global $_DATABASE;

benim işlevi üstünde, ama benim statik yöntemler TÜM için bunu yapmak istemiyorum. Global $ _DATABASE dizi başvurmak için benim sınıf içinde bir statik değişkeni almak için bir yolu var mı?

EDIT: Ben bu tüm statik olduğundan, yapıcı bunu atanamıyor ve yapıcı asla denir.

3 Cevap

Sen $_DATABASE değişkeni erişmek için süper-global dizi $_GLOBALS kullanabilirsiniz. Örneğin:

query( $GLOBALS['_DATABASE'], 'some query' );

Alternatif olarak, bu değişkenin içeriğini döndüren statik bir fonksiyon yazmak:

class SQLMapper
{
    static function getDatabase()
    {
        global $_DATABASE;
        return $_DATABASE;
    }

    static function find_user_by_id($id)
    {
        query( self::getDatabase(), 'some query' );
    }
}

If it hurts, its likely that you're doing it wrong.

Öncelikle daha somut bir çözüm sunmak için imkansız kod fazla görmeye, ama ben şiddetle uygulamak için onları uzun bir liste var gibi statik işlevleri (bu sesler böylece sizin sınıf yapısını yeniden düzenleme düşünün tavsiye ederim olmadan, kapalı ) olmayan statik hale gelebilirler.

Özünde, SQLMapper bir örneklenmiş örneğini erişme ve sonra örneğinden uygun yöntemi çağırarak düşünmelisiniz. Bu paradigmayı kullanarak, sadece o özgürce sınıfındaki tüm yöntemlerle başvurulan hangi $ _DATABASE için bir sınıf düzeyi özelliği örneğini olabilir.

Örneğin:

class SQLMapper {

    private $_db;

    public function __construct()
    {
    	global $_DATABASE;

    	$this->_db = $_DATABASE;
    }

    public function find_user_by_id($id) {

    	$sql = "Select * from User WHERE Id = ?";

    	$stmt = $this->_db->prepare($sql, $id);

    	return $stmt->execute();
    }
}

Bunu dedi, küresellerle kullanarak bu yüzden ben de sizin mevcut tasarım daha nesne yönelimli bir yaklaşım alarak düşünün ve tamamen uygulamadan küresellerle ortadan kaldırmak için denenmiş ve doğru yöntemler aramaya öneririm genelde kötü kod kaliteli bir işaretidir.

Özür, ne demek istediğini anlamak o kadar emin değilim, ama static keyword kullanarak deneyebilirsiniz?