PHP - Nerede bir veritabanı sınıfı başlatmak için en iyi yer neresidir?

3 Cevap php

Geçenlerde benim Page sınıfının __ yapısının dışında benim Db başlatılması kod aldı ve ben Page sınıfını başlatmak hemen sonra yerleştirilir. Ben her yerde (örneğin, diğer sınıflardan) onu erişmek mümkün olmak istiyorum, çünkü ben Page sınıf içinde kaldırıldı. Başlatılan zaman da buna sunucu, kullanıcı adı, şifre ve veritabanı bağımsız değişkenleri alır ve ben bu her zaman girmek istemiyorum.

Ben şimdi Page sınıfı altında erişebilirsiniz bir yolu var mı? Ben şimdiye kadar hiç boşuna (Ben şeyler yapmak için korkunç bir yoldur söylendi), hatta küresel bir kaç yöntemler, denedim ve. Ben hala OO yeni duyuyorum, ama ben elimden geldiğince kendimi öğretiyorum.

Ben statik bir sınıf yapmak gerekir? Bu ben kurulum var Db için tembel konnektörünü etkiler mi?

Herhangi bir yardım çok takdir.

Teşekkür ederim

[EDIT]

Benzer Soru: Global or Singleton for database connection?

3 Cevap

Bir çeşit küresel önceki yaklaşımı üzerinde bir gelişme olduğunu ve bu gibi doğru yoldayız (global değişkenler, tek ya da diğer bazı varyant olduğunu olun). Genellikle rağmen konuşma, sen (ben buraya almazsınız nedenlerle bir dizi için) programı devletinin kapsamını en aza indirmeye çalışın. Global bir değişken olması bu ilke ile çelişmektedir. Orada bu problem için farklı çözümler vardır, ama en güçlü ve çoğu zaman göz ardı yaklaşım, kontrol inversiyon kullanmaktır; Bunun yerine bir bağımlılık alma, sınıf bunu almak gerekir. Örneğin, şu anda bu var diyelim

class EditUserController {
  function saveUser() {
    $db = Database::GetInstance();
    $db->execute("update users set ...", ...);
  }
}

Sen içine bu değişebilir:

class EditUserController {
  function saveUser($db) {
    $db->execute("update users set ...", ...);
  }
}

Fonksiyon parametre seviyesinde bağımlılıkları geçen ama biraz hantal olabilir, bu yüzden bir uzlaşma, bir nesne başına düzeyde geçmek olabilir:

class EditUserController {
  protected $db;
  function __construct($db) {
    $this->db = $db;
  }
  function saveUser() {
    $this->db->execute("update users set ...", ...);
  }
}

Bu OO programlama oldukça yaygın bir kalıptır. Fonksiyon parametreleri geçirerek daha pratik olmasının yanı sıra, (onlar kullanılır) zamanında ayrılarak inşaat (paylaşılan bağımlılıkları birbirlerine kadar kablolu yerlerde), ek yararı vardır. Bu basit şeyler çok yapar.

Global değişkenler bir kullanımı var ve bu onlardan biri olacak. Eğer, birden fazla veritabanı bağlantıları ihtiyacı olacak (hatta hala) konum olasıdır sürece, o zaman ben bir global $ db nesneyi kurma ile ilgili bir sorun görmüyorum.

Alternatif bir yol nesneyi almak için kullanabileceğiniz bir statik "Fabrika" sınıf sahip olmaktır. Joomla 1.5 olarak, DB nesneye erişmek yolu bu gibi:

$db =& JFactory::getDBO();

getDBO fonksiyon kontrolleri DB nesnesi yaratıldı ise: o varsa, ona bir başvuru döndürmek aksi bağlamak ve başlatmak, ve sonra geri.

Bu eşit mevcut Kullanıcı nesne gibi diğer "-olabilir-made-küresel" nesneler için geçerli olabilir.

Tekiz yöntemi emin herhangi bir sınıfın tek bir örneği vardı yapmak için oluşturuldu. Insanlar küreselleşen kısayol için bir yol olarak kullanın çünkü Ama, tembel ve / veya kötü programlama olarak bilinir.