PHP

2012-10-09 4 views
7

में कक्षाओं को कैसे व्यवस्थित करें मैं PHP में ओओपी पर जाने पर काम कर रहा हूं। मैंने php.net पर स्पष्टीकरण पढ़ा है, लेकिन मुझे उम्मीद थी कि मैं यहां कुछ विशिष्ट उत्तर प्राप्त कर सकता हूं।PHP

मैंने अपने प्रश्न को स्पष्ट करने के लिए निम्नलिखित उदाहरण बनाने की कोशिश की। मान लें कि मेरे पास "डेटाबेस", "उत्पाद" और "उपयोगकर्ता" वर्ग हैं, और यदि उपयोगकर्ता के पास पहुंच है तो मैं उत्पादों को प्रदर्शित करना चाहता हूं।

इसलिए मैं "उत्पाद" वर्ग "शो प्रोडक्ट्स()" फ़ंक्शन को कॉल करता हूं, जो बदले में "उपयोगकर्ता" वर्ग का एक उदाहरण बनाता है, जो "डेटाबेस" ऑब्जेक्ट का उदाहरण बनाता है और उपयोगकर्ताओं को एक्सेस स्तर की जांच करता है।

यदि उपयोगकर्ता का उपयोग है, तो "showProducts()" फ़ंक्शन "डेटाबेस" ऑब्जेक्ट का एक और उदाहरण बनाता है, और डेटाबेस से पूछताछ करता है।

class Database{ 

    public function query(){ 
     //runs query here 
    } 

    public function __construct() { 
     //sets up connection here 
    } 

} 

class User{ 

    public function checkAccess(){ 
     $db = new Database(); 
     $db->query(//pass in query to check access) 
     //does stuff, then returns true or false 
    } 

} 

class Products{ 

    public function showProducts(){ 

     $user = new User(); 

     if($user->checkAccess()) 
     $db = new Database(); 
     $db->query(//pass in query to get products) 
     } 

} 

मुझे उम्मीद थी कि कोई यह उचित तरीके से कैसे किया जा सकता है।

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

अगर मेरा प्रश्न स्पष्ट नहीं है, तो मैं क्षमा चाहता हूं, और किसी भी प्रतिक्रिया के लिए अग्रिम धन्यवाद !!

उत्तर के लिए सभी को धन्यवाद!

उत्तर

11

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के लिए फॉर्म प्रक्रियात्मक चलते समय आपको और अधिक समझना चाहिए कि कक्षाएं कैसे बनाएं। ओओपी ओओपी में सर्वोत्तम प्रथाओं, सिद्धांतों और पैटर्न का पालन करने के बारे में कक्षाएं नहीं लिख रहा है।

आपको किसी अन्य वस्तु के अंदर नई वस्तुओं को तुरंत चालू नहीं करना चाहिए, आपको उपयोगकर्ता ऑब्जेक्ट देना चाहिए, उसका डेटाबेस ऑब्जेक्ट जो उपयोगकर्ता कन्स्ट्रक्टर या सेटर विधि के माध्यम से निर्भर करता है। इसे निर्भरता इंजेक्शन कहा जाता है। लक्ष्य उन वर्गों को ऑब्जेक्ट देना है जिन्हें उन्हें कन्स्ट्रक्टर या सेटर विधि के माध्यम से चाहिए। और उन्हें उस वर्ग के बाहर से निकाला जाना चाहिए, इसलिए कक्षा को कॉन्फ़िगर करना आसान है। और जब एक वर्ग का निर्माण होता है तो आप देखना चाहते हैं कि कक्षा में निर्भरताएं क्या हैं। आप नियंत्रण सिद्धांत यहाँ के उलट के बारे में पढ़ सकते हैं: IoC

तो फिर अपने कोड इस तरह दिखेगा:

<?php 

// User object that depends on Database object, and expects it in constructor. 

class User 
{ 
    protected $database; 

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

    // -- SNIP -- 
} 

?> 

अब जब कि उपयोगकर्ता वर्ग आप यह कर उपयोग करने के लिए:

<?php 

    $database = new Database($connParams); 
    $user = new User($database); 

?> 

आप कर सकते हैं निर्भरता सेट करने के लिए सेटटर विधियों का उपयोग करके निर्भरता इंजेक्शन का भी उपयोग करें, लेकिन Il आपको अपने लिए यह Google पर जाने दें :)

यह बताता है कि, कंट्रो के इनवर्जन के बारे में पढ़ें सिद्धांत, और निर्भरता इंजेक्शन और निर्भरता इंजेक्शन कंटेनर के बारे में, कक्षाओं का प्रबंधन करने के लिए ये सबसे अच्छे तरीके हैं।

मैंने बहुत सारे PHP कोड को देखा है जो "ओओपी" है और वास्तव में वे क्लासेस को कार्यक्षमता नामस्थान के रूप में उपयोग कर रहे हैं :) तो ओओपी सिद्धांतों और पैटर्न के बारे में जानें।

मज़े करो! :)

+0

उत्तर के लिए बहुत बहुत धन्यवाद!तो अगर मेरे पास उपयोगकर्ता वर्ग पर संदर्भित एक और वर्ग था, तो मैं $ उपयोगकर्ता ऑब्जेक्ट में पैरामीटर के रूप में भी पास करूंगा? – Ben

+0

हाँ, आप कर सकते हैं! आप जितनी चाहें उतनी कक्षाएं पारित कर सकते हैं। ऑब्जेक्ट को वास्तव में उस वस्तु को काम करने की आवश्यकता होने पर आप कन्स्ट्रक्टर के माध्यम से ऑब्जेक्ट पास कर सकते हैं। और यदि ऑब्जेक्ट वैकल्पिक है तो आप इसे सेटटर विधि के माध्यम से पारित कर सकते हैं। एक बार जब आप जटिल निर्भरता प्राप्त कर लेते हैं, तो आप निर्भरता इंजेक्शन कंटेनर का उपयोग करने के बारे में सोच सकते हैं जहां आप निर्भरता का वर्णन करेंगे और कंटेनर अन्य वस्तुओं से ऑब्जेक्ट इकट्ठा करने और इसे वापस करने में सक्षम होगा :) आप यहां निर्भरता इंजेक्शन और निर्भरता इंजेक्शन कंटेनर पर और अधिक पढ़ सकते हैं : http://fabien.potencier.org/article/12/do-you-need-a- निर्भरता- इंजेक्शन- कंटेनर – otporan

0

सभी अपने कोड उपयोग Singleton पैटर्न के लिए एक वस्तु बनाने के लिए:

class Database{ 
    private $db_descriptor; 

    private function __construct(){ 
     /* connect and other stuff */ 
    } 
    public static function getInstance(){ 
     static $instance; 
     if($instance === null){ 
      $instance = new self(); 
     } 
     return $instance; 
    } 
} 

और तुम उपयोगकर्ताओं के साथ उसी तकनीक का उपयोग कर सकते हैं, मैं PHP 5.4 के साथ और अधिक कहते हैं कि तुम सिंगलटन पैटर्न के लिए 1 विशेषता का उपयोग कर सकते हैं। एक आखिरी युक्ति: जब आप डेटाबेस और अन्य भारी चीजों के साथ काम करते हैं तो lazy initialization नामक तकनीक का उपयोग करें। जब आप अपने ओओपी कौशल में सुधार करते हैं तो Doctrine Project देखें, वे उस तकनीक का बहुत उपयोग करते हैं!

+0

दरअसल मैं एंटरप्राइज़ फ्रेमवर्क से उदाहरणों को देखने की सिफारिश करता हूं ताकि चीजें कैसे की जा सकें। आपको तुरंत उपयोग करने की आवश्यकता नहीं हो सकती है लेकिन वे आपको चीजों को ढांचे के बारे में एक अच्छा विचार देंगे। – prodigitalson

+0

क्या आप किसी को सलाह दे सकते हैं? मैंने पहले उनके साथ काम नहीं किया था। – kirugan

+1

सिम्फनी 2 और ज़ेंड 2 फ्रेमवर्क एकमात्र ढांचे हैं जो देखने के लायक हैं :) मुझे पता है कि इसके लिए मुझे बहुत सारे वोट मिलेगा। लेकिन PHP में उचित ओओपी सीखने के लिए वे दोनों सबसे अच्छे हैं! – Limeni

2

अपने रचनाकारों या अन्य विधियों के अंदर वस्तुओं को तुरंत चालू न करें। उन्हें पैरामीटर के रूप में जाना जाता है, अधिमानतः एक अलग वर्ग के अंदर कारखाने के रूप में जाना जाता है। इससे आपके कोड का परीक्षण करना आसान हो जाएगा, लेकिन ऑब्जेक्ट्स बनाना आसान बना देगा।

इसके अलावा, सिंगलेट का उपयोग करने की कोशिश न करें। यह "वैश्विक चर" का ऑब्जेक्ट उन्मुख संस्करण है, और आप वैश्विक चर का उपयोग नहीं करना चाहते हैं। यह आपके कोड का परीक्षण वास्तव में कठिन, लगभग असंभव बनाता है।

यह वीडियो http://www.youtube.com/watch?v=-FRm3VPhseI देखें कि यह समझने के लिए कि सिंगलेट का उपयोग करना बुरा क्यों है। विशेष रूप से क्रेडिट कार्ड उदाहरण 1 9:00 बजे देखने लायक है।

यदि आप वास्तव में इसे अत्याधुनिक करना चाहते हैं, तो "निर्भरता इंजेक्शन" की अवधारणा पर नज़र डालें। अनिवार्य रूप से, कक्षा से बाहर की जरूरत वाली चीजें पूरी तरह से गुजरती हैं, लेकिन ऐसे ढांचे हैं जो आपके लिए यह स्वचालित रूप से करते हैं, इसलिए आपको अब एक कारखाना लिखना नहीं है। इन्हें "निर्भरता इंजेक्शन कंटेनर" या "डीआईसी" कहा जाता है।

+0

बहुत बहुत धन्यवाद! Googleing फैक्ट्री क्लास अब। क्या आप वेबसाइटों के लिए कक्षा संरचनाओं की स्थापना पर किसी भी अच्छे सामान्य ट्यूटोरियल के बारे में जानते हैं? मैं सिद्धांतों को समझना शुरू कर रहा हूं, लेकिन जहां तक ​​एक व्यावहारिक कार्यान्वयन है, मैं अभी भी थोड़ा खो गया हूं। – Ben

+0

सबसे पहले मैं अनुशंसा करता हूं कि आप ऑटोलोडिंग पर नज़र डालें। इसे आसान बनाने के लिए कई प्रणालियां हैं, लेकिन यह आपकी कक्षाओं को व्यवस्थित करने के लिए उबलती है - प्रति पृष्ठ एक वर्ग - एक निर्देशिका पेड़ में, और तदनुसार कक्षा के नामों को संरेखित करना ताकि स्वत: लोडर, जो पैरामीटर के रूप में केवल आवश्यक वर्ग नाम प्राप्त कर सके पथ और फ़ाइल नाम वर्ग में होना चाहिए। एक जीवित उदाहरण के लिए ज़ेंड फ्रेमवर्क (1 या 2) पर एक नज़र डालें। आपको यह भी पता चल सकता है कि अन्य लोग वहां भी अपनी कक्षाओं का नाम कैसे देते हैं। – Sven

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