2012-04-06 11 views
5

अनिवार्य रूप से, मैं केवल दो कक्षाएं बना रहा हूं, जहां एक वर्ग, इस मामले में कक्षा ए, किसी अन्य वर्ग में एक कार्य चलाता है, इस मामले में कक्षा बी, डेटाबेस से कुछ जानकारी प्राप्त करने के लिए।क्लास कन्स्ट्रक्टर अन्य वर्ग के साथ हस्तक्षेप

हालांकि, जब B_runtime() वास्तव में डेटाबेस पर कॉल करता है तो मुझे त्रुटि Cannot access protected property A::$db मिलती है।

क्या मुझे समझ नहीं आता कि भले ही मैं दो __construct की राशि दोनों वर्गों में पीडीओ बयान वर्ग ए से डेटाबेस कनेक्शन का उपयोग करने पर बहुत लगातार किया जा रहा है है

मुझे यकीन है कि यह कुछ करने के लिए है हूँ इस तथ्य के साथ करें कि मैं कक्षा ए के भीतर से B_runtime() चला रहा हूं क्योंकि ऐसा नहीं होता है अगर मैं इसे कक्षा ए

से जानता हूं तो मुझे पता है कि मैं कक्षा ए में protected $db; को सार्वजनिक चर में बदल सकता हूं हालांकि, मैं वास्तव में उत्सुक हूं कि मैं इसे कैसे ठीक कर सकता हूं।

ob_start(); 
include('/config.php'); 
ob_end_clean(); 

$A = new A($db); 
$B = new B($db); 

echo $A->A_runtime(); 

class A{ 
    protected $db; 
    public function __construct($db){ 
     $this->db = $db; 
    } 
    public function A_runtime(){ 
     return B::B_runtime();  
    } 
} 

class B{ 
    protected $db; 
    public function __construct($db){ 
     $this->db = $db; 
    } 
    public function B_runtime(){ 
     $preparedStatement = $this->db->prepare('SELECT * FROM z_mod_html WHERE ModuleLink = :moduleid LIMIT 1'); 
     $preparedStatement->execute(array(':moduleid' => '1')); 
     $rows = $preparedStatement->fetchAll(); 
     return $rows[0]['HTML']; 
    } 
} 

कोड की लंबी राशि के लिए खेद है - यह बहुत सराहना की जाएगी अगर कोई किसी भी विचार या सुझाव है। धन्यवाद।

उत्तर

3

आप बी के विधि को विधि में पास कर सकते हैं। इस तरह आप भी वर्ग बी पर अपने विधि के dependancy परिभाषित

$A = new A($db); 
$B = new B($db); 

echo $A->A_runtime($B); 

class A{ 
    //... 
    public function A_runtime($instance){ 
     return $instance -> B_runtime();  
    } 
} 

तुम भी संकेत देने के लिए कि आप वहाँ वर्ग बी का एक उदाहरण उम्मीद कर रहे हैं PHP 5 में type hinting उपयोग कर सकते हैं:

public function A_runtime(B $instance){ 
+0

हां सही जवाब, तथापि, वहाँ एक तरीका है कि मैं दो कंस्ट्रक्टर्स साथ ऐसा कर सकते के रूप में मैं अब कर रहा हूँ है? – SineCosine

+0

@SineCosine आप अपने सभी रचनाकारों को रख सकते हैं। मैंने बस एक // // ... 'चिह्न रखा जहां कन्स्ट्रक्टर है, सब कुछ वही रहता है। केवल विधि ('A_runtime') और जिस तरीके से आप इसे कॉल करते हैं। – kapa

+0

ओह, पूरी तरह से याद किया। धन्यवाद मुझे नहीं पता था कि आप यह कर सकते हैं। – SineCosine

3

ओए ।

पहले, आप एक स्थैतिक विधि के रूप में एक गैर स्थैतिक विधि को बुला रहे हैं।

B::B_runtime(); 

केवल, इस तरह से इस्तेमाल किया जाना चाहिए अगर B_runtime एक स्थिर विधि

static public function B_runtime(){ 

दूसरे के रूप में घोषित किया गया अपनी कक्षा एक बाहरी निर्भरता जो आम तौर पर अच्छा नहीं माना जाता है है। एक वर्ग को केवल उस पर भरोसा करना चाहिए जो ग्लोबल्स पर नहीं है। इसे निर्भरता उलटा सिद्धांत कहा जाता है। यदि कोई वर्ग किसी चीज़ पर निर्भर है, तो आपको इस निर्भरता को तर्क के माध्यम से देना चाहिए, और इससे भी बेहतर, यह सुनिश्चित करने के लिए कि संकेत निर्भरता है, उस पर निर्भरता का उपयोग करें।

public function A_runtime(B $object_b){ 

इस एक कदम आगे ले करने के लिए, आप भी प्रकार ठोस वर्ग के बजाय इशारा के लिए सार या इंटरफेस का उपयोग करना चाहिए। इस तरह आप बी के एक अलग संस्करण के साथ बी को स्विच कर सकते हैं यदि यह कभी भी आवश्यक हो।

interface BInterface { 
    public function B_runtime(); 
} 

तो

public function A_runtime(BInterface $object_b){ 

OO डिजाइन के ठोस सिद्धांतों पर पढ़ा।

http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)

+0

हाँ, मैं निश्चित रूप से इसमें पढ़ूंगा, धन्यवाद। और मैं विशेष रूप से इंटरफेसिंग और सारणीकरण में देखूंगा क्योंकि यह बहुत दिलचस्प लग रहा है। – SineCosine

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