Kodları lütfen aşağıdaki butonları kullanarak renklendirin. Örnek: <php> echo "Selam Dünya"; </php>
Yardım
karakter kaldı

oop bir soru???

Merhabalar

Php de nesne tabanlı uygulamalar geliştirmeye başladım. Bir sorum olacaktı.

Örneğin veritabanı.php

class veriBaglan ()

function baglanti{

//bağlantı kodları
}

function sorgu() {

//sorgu kodları
}

Bir sayfada sorgu kodlarını çağırdım. Ancak başka bir sayfada veri Insert ettirmem gerekiyor. O sayfada kullanacağım kodlar için çağıracağım içinde Insert komutlarının olduğu class için baglanti fonksiyonu bir daha oluşturacağım kullanacak mıyım?Veritabanı bağlantısı gerektiren ayrı dosyalardaki her class için baglanti fonksiyonu mu yazmalıyım?

Buna ek olarak ikinci bir sorum vardı. Bu php dosyasında diyelim kullanıcıları sorgulattım, bir başka sayfada bir başka alana yönelik içerikleri sorgulatcam, her biri için ayrı class lar mı olmalı, yoksa bir class içinde lazım olacak her sorgu için bir fonskiyon mu yazmalıyım? Mantığını açıklayabilirseniz çok sevinirim.
+0
-0
Cevaba KatılıyorumKatılmıyorum
Cevap Yaz Yorum Yaz Arşivime Ekle Takip Et

Cevaplar

  • Kemal adlı üyenin fotoğrafı
    10 yıl önce yazılmış
    63 cevap - 10 soru
    class veribagla{
        public $db,$root,$pass,$host;
        function baglanti(){
            // bağlantı işlemleri
        }
        
        function query(){
            // sorgu işlemleri
        }
    }
    

    şeklinde olmalıdır en basitinden.
  • yunusy adlı üyenin fotoğrafı
    10 yıl önce yazılmış
    9 cevap - 3 soru
    Daha önce hiç kullanmadım ancak teorik olarak bilgim var. O yüzden aklımdan bir kod yazıp gönderemeyeceğim burada. Ancak sanırım aradığınız şey 'Singleton Design Pattern' oluyor. Google'da arama yaparsanız birçok sonuç çıkar. Dediğiniz gibi, sadece 1 kere class oluşturularak işler hallediliyor
  • madpoet adlı üyenin fotoğrafı
    10 yıl önce yazılmış
    83 cevap - 0 soru
    Bu sorunun tam doğru bir cevabı yok hakkında ama muhtelif design pattern'ler var bununla ilgili olarak.

    En basitçe şöyle yapabilirsin:

    class UserModel
    {
        private $_db;
    
        public function __construct() {
            $this->_db = DbWrapper::getInstance();
        }
    
        public function getUser($id) {
            return $this->_db->fetchRow("select * from users where id=?", $id);
        }
    
        public function create($data) {
            $this->_db->insert('users', array(
                'nick' => $data['nick'],
                'email' => $data['email']
                // ......
            ));
    
            return $this->_db->lastInsertId();
        }
    }
    


    Data'ya erişen tüm fonksiyonları aynı class içerisinde toplamanı tavsiye etmem, ileride karışır. Genelde database'deki her table bir class gibi düşünebilirsin, ancak istisnalar var tabii. Entity olarak düşünerek dataya erişen fonksiyonları gruplamak lazım.

    Data Access Object, ActiveRecord, Table Data Gateway, Row Data Gateway gibi terimleri araştırabilirsin...
    • serdar_alkan adlı üyenin fotoğrafı serdar_alkan
      madpoet hocam,

      şimdi siz kullanıcı girişinin de içinde bulunduğu bir class yazmışsınız ancak ben makale girişi, sorgulaması v.b. ile alakalı bir fonksiyon yazcam diyelim. O class ın içinde de veritabanı bağlantısı olan bir fonskiyon yazmam gerekecek mi? Gerekecekse her seferinde veritabanına bağlanma olayı olması bir garip olur.

      Kod yazma olarak sorunum yok arkadaşlar. Kodlarla alakalı değil mantığı ile alakalı sorunum var.
      10 yıl önce yazılmış
    • madpoet adlı üyenin fotoğrafı madpoet
      İşte DbWrapper::getInstance(); her seferinde db bağlantısı kurmuyor. Singleton olarak geçen bir yöntem, ilk çağırıldığında bağlantıyı kurar, sonrakilerde kurmaz, olan class'ı kullanır.

      Alternatif olarak global bir değişken kullanabilirsin ki hiç tavsiye edilen birşey değildir.
      Zend_Registry gibi bir yapı kullanabilirsin, ya da her model class'ını çağırdığında $db gibi bir parametre gönderebilirsin:

      new UserModel($db);
      


      gibi. Bu da yine global olarak değişken kullanmayı gerektiriyor o yüzden iyi bir çözüm değil bence.

      Ben projelerimde Zend_Registry'ye db'yi kaydedip model class'larında geri çağırıyorum. Bunu bir parent class'ta yapıyorum, bu class'ın ek özellikleri de olduğu için ben bunu uygun gördüm ama dediğim gibi bu sorunun tam bir cevabı yok...
      10 yıl önce yazılmış
    • serdar_alkan adlı üyenin fotoğrafı serdar_alkan
      Teşekkür ederim saolasın arkadaşım.

      Şimdi yabancı kaynaklardan da baktım da singleton design pattern ile bu şekilde çözülüyormuş. Database class ını ram de tutup tekrar tekrar oluşturmak zorunda kalmıyoruz. Anlaşıldı :))
      10 yıl önce yazılmış