Fonksiyonları ve çoklu komut (PHP) bir singleton veritabanı sınıfını kullanarak - iyi kullanma yöntemleri

4 Cevap php

Ben ile olsun bir tek db bağlantısı var:

$ DbConnect = mydatabase :: getInstance ();

hangi yeterince kolaydır. Benim soru fonksiyonları ve sınıfları bu bağlantıyı kullanarak en az retorik ve meşru bir yol olarak ne olduğunu? Bu, değişken küresel beyan her işleve aktarmak ve / veya her fonksiyon içinde bu değişken yeniden zorunda saçma gibi görünüyor. Bunun için başka bir cevap var mı?

Açıkçası ben bir çaylak ve ben bu soruna gerçekten benim için çok çekici hiçbiri 10 farklı yollar, yolumu çalışabilirsiniz. Ben $ dbConnect ... küresel beyan ya da ben $ _SERVER dizi değişkeni ekleyebilirsiniz biliyorsun içeri geçmesine gerek kalmadan herhangi bir fonksiyon değişken erişilebilir yanlış bir şey olduğunu olabilir eğer çok daha kolay olurdu Bu yapıyorsun? Bu bana biraz uygunsuz görünüyor.

Başka bir hızlı soru: bunu yapmak için kötü bir uygulama mı:

$ Result = mydatabase :: getInstance () -> sorgu ($ sorgu);

bir işlev içinde doğrudan?

4 Cevap

Bazıları bu tadı aşağı gelecektir. İşte biz de üzerinden bir ADODB bağlantısı tanıtıcı elde

$db = Registry :: getDB();

Aynı şekilde yöntem zincirleme kullanarak bu kod bazı steno yapabilirsiniz:

$name = Registry :: getDB()->getOne(
    "SELECT name FROM user WHERE user_id = ?", $userId
);

Bir kayıt defteri kullanarak arama kodu Registry sınıfına somut bir bağımlılık anlamına gelir. Bu kodunuzu zor (personally this is the only time I've banged my head on the wall using a Registry) test yapar.

Eğer add unit tests kodunuz için, sık sık her zaman veritabanına işlemek kalmazsınız veritabanı bağlantısı alay etmek isterdim istiyorsanız, test paketi çalıştırın.

Hala koşu ortamında inceleyerek ve bir sahte veritabanı soyutlama sınıfı ile kayıt yapılandırarak bu yuvarlak alabilirsiniz ama bağımlılık enjeksiyon (DI) gibi zarif değil.

(Bir PHP geliştiricisi için) gördüm DI ve konteynerlerin en iyi açıklama Fabien Potencier's Dependency Injection with PHP 5.3 (slayt 9 başlayarak) bulunmaktadır.

Bir Registry yerine etrafında bir DI konteyner geçmek, o (Kayıt Defteri gibi) bağımlılıkları kolları elde etmek için şık ve kolay bir yol sağlar ama esnek ve gerektiğinde bu bağımlılıkları taklit böylece daha gevşek bağlı olduğunu.

Lütfen uygulama boyunca tekil kullanımı ile yanlış bir şey yok, bu çoklu bağlantı ile çalışmak için gelecekte zor kanıtlamak çünkü veritabanı abastraction sınıflar için Singleton deseni karşı insanlar var. Ancak bu durumda Singleton birçok benzerlik gösterir Registry desen, hem de çalışması gerekir.

Ben doğru yolda olduğunu söylerdim!

Benim veritabanı bağlantısı tutmak için süper küresel $ GLOBALS değişken kullanabilirsiniz. Harikalar yaratıyor.

Eğer söz tüm faydaları vardır ve bu konuda yanlış ya da uygunsuz bir şey sürece mantıklı ve benzersiz karma dizi için anahtar ve veritabanı bağlantısını kurma ve dizide saklayarak için tek giriş fonksiyonunu kullanmak gibi kesinlikle yoktur.

Ben küresel değişkenler hakkında tüm inilti için hazır, şimdi benim kulak tıkacı koyacağım!

@ Downvoters - Bazı yatmadan önce okuma:

http://stackoverflow.com/questions/484635/are-global-variables-bad

http://stackoverflow.com/questions/357187/global-variables-when-are-they-acceptable

Eğlence için bazı alıntılar:

"Global variables are used all the time, by many, many programmers. We just call them Singletons now." - DannySmurf

"They are totally, fundamentally, absolutely, incredibly, astoundingly evil." - Vinko Vrsalovic

And the best answer here from cletus himself: http://stackoverflow.com/questions/1557787/are-global-variables-in-php-considered-bad-practice

Ben yıllardır bu ile biraz uğraştım. Ben $ _Global veya $ _SERVER gibi süper küresel değişkeni bir Singleton-türetilen nesne ekleyerek ilk etapta bir Singleton sınıfı bina noktasının bir sürü çıkarmadan olduğunu söyleyebilirim.

Gördüğüm kadarıyla iyi uygulama önerdi gibi erişmek için:

$result = Database_Class::singleton()->query('whatever');

Ben eklemek istiyorum tek şey Singleton birden çok kez nesne kullanmak istiyorum (bir işlev veya yöntem gibi) bazı yerel kapsam durumunda, bu gibi bir şey yapmaya değer olabilir ki:

function func() {
  $db = Database_Class::singleton();
  $db->query('insert into whereever');
  $db->query('insert into whereever');
  $db->query('insert into whereever');
  $db->query('insert into whereever');
}