PHP Veritabanı ve OOP Uygulamaları

4 Cevap php

Onun zor Bu durumu açıklamak için ama örneğe bakınız.

Ben sayfa yüklendiğinde, ben bir veritabanı sınıf başlatmak bir web sitesi kodlanmış. Ben veritabanına erişmek için gereken herhangi bir fonksiyonları bir fonksiyon parametre olarak bu sınıf gönderdi.

Ben bu kötü yaklaşım olduğunu biliyorum ama şu anda ben nasıl bu başka bir şekilde yapmak için hiçbir ipucu var. Lütfen bana yardım edebilir.

Örnek

class sms {

    function log_sms($message, $db) {

    	$sql = "INSERT INTO `smslog` SET
    		`mesasge` = '$message'
    		";
    	$db->query($sql);

    	if ($db->result)
    		return true;
    	return false;
    }

}

Daha sonra ana sayfada ..

$db = new db(username,pass,localhost,dbname);

$sms = new sms;

$sms->log_sms($message, $db);

Bundan daha iyi bir yaklaşım var mı?

4 Cevap

bağımlılıkları sorunu (A nesnesi B nesne gerektirir) çözmek için nasıl seçenekler vardır:

yapıcı enjeksiyon

  class Sms { 
        function __construct($db) ....
  }

  $sms = new Sms (new MyDbClass);

setter enjeksiyon

  class Sms { 
        protected $db;
  }
  $sms = new Sms;
  $sms->db = new MyDbClass;

'Kayıt' desen

 class Registry {
     static function get_db() {
          return new MyDbClass;
 }}

 class Sms {
      function doSomething() {
          $db = Registry::get_db();
          $db->....
  }}

'Hizmet lokasyon' desen

 class Loader {
     function get_db() {
          return new MyDbClass;
 }}

 class Sms {
      function __construct($loader) {
         $this->loader = $loader;

      function doSomething() {
          $db = $this->loader->get_db();
          $db->....
  }}

  $sms = new Sms(new Loader);

Otomatik Konteyner tabanlı bağımlılık enjeksiyon, bakınız, örneğin, http://www.sitepoint.com/blogs/2009/05/11/bucket-is-a-minimal-dependency-injection-container-for-php

   interface DataSource {...}
   class MyDb implements DataSource {...}

    class Sms {
        function __construct(DataSource $ds) ....


    $di = new Dependecy_Container;
    $di->register('DataSource', 'MyDb');
    $sms = $di->get('Sms');

Birkaç ;) isim

Ayrıca ben daha önce verdiği Fowler yazı gerçekten okumaya değer

Yeni başlayanlar için veritabanını kullanmak için gereken sınıfların her bir korunan $ db değişken yapabilirsiniz. Daha sonra sınıf yapıcısı için $ db geçebileceği. İşte güncellenmiş kod:

$db = new db(username,pass,localhost,dbname);
$sms = new sms($db);
$sms->log_sms($message);

class sms {

    protected $db;

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

    public function log_sms($message) {
        $sql = "INSERT INTO `smslog` SET
                `mesasge` = '$message'
                ";
        $this->db->query($sql);

        if ($this->db->result)
                return true;
        return false;
    }
}

Bu örnek, PHP 5 olduğunu.

Singleton is also good practice in application design. They are very useful to avoid repeated queries or calculations during one call. Passing Database object to every method or constructor is not a very good idea, use Singleton instead.

veritabanı uzatmak, ya da db sınıfı içinde statik yöntem ekleyin. (Ben de db yapıcı yöntemi içinde config için arama ediyorum)

class database extends db
{
	public static function instance()
	{
		static $object;

		if(!isset($object))
		{
			global $config;

			$object = new db($config['username'],$config['pass'],$config['localhost'],['dbname']);
		}

		return $object;
	}
}

senin yöntem statik yapmak

class sms {

    public static function log($message) {

        $sql = "INSERT INTO `smslog` SET `mesasge` = '$message'";

        database::instance()->query($sql);

		return (bool) database::instance()->result;
    }
}

Eğer sms oturum açmanız gerekir dahaki sefere sadece bu gibi statik arama yapmak

sms::log($message);

Iki listeleri, mevcut bağlantılardan birini dağıttı bağlantılarının diğer sahiptir ve sadece bir bağlantı havuzu var, statik bir sınıf olabilir ya.

Eğer MySQL gibi hızlı bir bağlantı zaman olan bir şey, kullanıyorsanız ya, o sadece veritabanı sınıfında bağlantı oluşturmak, bu işlevsellik için gerekli tüm sorguları yapmak, sonra kapatın. Bu benim tercih edilen yaklaşımdır.