2011-06-09 19 views
5

मैं ओओपी स्टाइल PHP के लिए बहुत नया हूं, और मैं पीडीओ को भी लागू करने की कोशिश कर रहा हूं। मुझे यह अच्छी छोटी कक्षा ऑनलाइन मिली जो डेटाबेस कनेक्शन को संभालती है, हालांकि मुझे नहीं पता कि इसे किसी अन्य वर्ग से कैसे पहुंचाया जाए। यहाँ कोड है:PHP और पीडीओ कक्षा प्रश्न

class PDO_DBConnect { 
    static $db ; 
    private $dbh ; 
    private function PDO_DBConnect() { 
     $db_type = 'mysql'; //ex) mysql, postgresql, oracle 
     $db_name = 'postGal'; 
     $user = 'user' ; 
     $password = 'pass' ; 
     $host = 'localhost' ; 
     try { 
      $dsn = "$db_type:host=$host;dbname=$db_name"; 
      $this->dbh = new PDO ($dsn, $user, $password); 
      $this->dbh->setAttribute(PDO::ATTR_PERSISTENT, true); 
      $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } catch (PDOException $e) { 
      print "Error!: " . $e->getMessage() . "\n" ; 
      die() ; 
     } 
    } 

    public static function getInstance () { 
     if (! isset (PDO_DBConnect::$db)) { 
      PDO_DBConnect::$db = new PDO_DBConnect () ; 
     } 
     return PDO_DBConnect::$db->dbh; 
    } 
    } 

    $db_handle = PDO_DBConnect::getInstance(); 

    class Person 
    { 
    function __construct() 
    { 
     $STMT = $db_handle->prepare("SELECT title FROM posts WHERE id = ? AND author = ? LIMIT 20"); 
     $STMT->execute(array('24', 'Michael')); 

     while ($result = $STMT->fetchObject()) 
     { 
     echo $result->title; 
     echo "<br />"; 
     } 
    } 
    } 

मैं अपने व्यक्ति वर्ग के अंदर $db_handle चर में पहुँच प्राप्त कर सकते हैं? क्या मुझे व्यक्ति वर्ग के अंदर परिवर्तनीय को तुरंत चालू करना है? यदि हां, तो क्या इसका मतलब है कि मुझे हमेशा इसे $this->db_handle के रूप में कॉल करना होगा? मैं उससे बचने की उम्मीद कर रहा था। (मैं अभी भी केवल वर्गों के साथ चर गुंजाइश की एक बहुत ही बुनियादी समझ है)

+0

आप PHP5 ओओ संरचनाओं का उपयोग क्यों कर रहे हैं, लेकिन PHP4-era समान-नाम-के-श्रेणी के कन्स्ट्रक्टर का उपयोग कर रहे हैं? कृपया इसके बजाय '__construct' पर स्विच करने पर विचार करें। – Charles

+0

मुझे नहीं लगता कि उन्होंने पीडीओ_DBC कनेक्ट क्लास लिखा था, क्योंकि उन्होंने उल्लेख किया था कि उन्होंने "इसे पाया"। – Problematic

उत्तर

5

इस पर इसे संभालने के तीन तरीके हैं (कम से कम)। सबसे पोर्टेबल, और अनुशंसित को "निर्भरता इंजेक्शन" कहा जाता है, जिससे आप अपने वर्ग में __construct() के माध्यम से डेटाबेस हैंडल पास करते हैं और उसे कक्षा चर में संग्रहीत करते हैं। $this->db के साथ इसे एक्सेस करने की आवश्यकता है जैसे आप करना नहीं चाहते थे।

class Person { 
    // Member to hold the db handle 
    public $db; 

    public function __construct($db_handle) { 
    // Assign the handle to a class member variable in the constructor 
    $this->db = $db_handle; 
    } 
    public function otherFunc() { 
    $this->db; // do something 
    } 
} 

$person = new Person($db_handle); 

अगला विधि बल्कि में इसे पारित से $db_handle निर्माता के अंदर का दृष्टांत होगा। यह एक छोटे से परीक्षण और डिबग करने के लिए कठिन है।

class Person { 
    public $db; 
    public function __construct() { 
     $this->db = PDO_DBConnect::getInstance(); 
    } 
} 

अंत में, आप $db_handle एक global रूप में कहते हैं जब भी आप अपने वर्ग में इसका इस्तेमाल कर सकते हैं। यह शायद पढ़ने और डीबग करने के लिए सबसे कठिन है।

class Person { 
    public function __construct() { 
    global $db_handle; 
    } 
    public function otherFunc() { 
    global $db_handle; 
    $db_handle; // do something 
    } 
} 
+0

इस पर विस्तार के लिए बहुत बहुत धन्यवाद। वही था जो मुझे जानने की जरूरत थी। मुझे लगता है कि निर्माण विधि इसके लिए सबसे अधिक समझ में आता है जिसके लिए मैं इसका उपयोग करना चाहता हूं। धन्यवाद! –

+0

बस वास्तव में उलझन में क्या कहा जा रहा है और जब कक्षा के अंदर एक समारोह के समान नाम है। क्या यह कुछ भी पूरा करता है? –

+0

@Eujung किम किस वर्ग के अंदर एक समारोह के समान नाम है? –

3

आप Dependency Injection उपयोग करना चाहिए:

$steve = new Person($db_handle); 

और हाँ, वाक्य रचना आप से बचने के लिए उम्मीद कर रहे हैं का उपयोग कर जिस तरह से यह करना है। आप $dbh = $this->db_handle; कहकर क्लास वेरिएबल को एक स्थानीय विधि में हमेशा असाइन कर सकते हैं, जो मुझे लगता है कि थोड़ा सा तेज़ है।

3

तुम सच में अपने व्यक्ति वस्तु अंदर से डेटाबेस काम करना चाहिए (separation of concerns का कहना है कि इस कहीं और का ध्यान रखा जाना चाहिए), तो आप या तो (क निर्माता तर्क के रूप में यह पारित कर सकते हैं अपने उपयोग के आधार पर, यह उस तरह लग रहा है हो सकता है कि आप जिस तरह से जाना चाहते हैं), या एक सेटर इंजेक्शन के रूप में। पूर्व के लिए:

class Person 
{ 
    function __construct($db_handle) 
    { 
     // ... your existing code 

तो फिर तुम इतने तरह अपने व्यक्ति वस्तु का दृष्टांत:

$person = new Person($db_handle); 

वास्तव में एक ही तरीका है कि आप स्थानीय गुंजाइश में चर कॉपी किए बिना $this->db_handler के प्रयोग की आवश्यकता से बचने कर सकते हैं यही कारण है कि।

संबंधित मुद्दे