2008-09-17 14 views
11

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

कोई भी इस बात को समझा सकता है कि कोई बेवकूफ समझ सकता है, ओओ और यह PHP में कैसे काम करता है या मुझे एक बेवकूफ गाइड ट्यूटोरियल में इंगित करता है?

+1

मुझे पता है कि आपका क्या मतलब है ... बस बहुत कुछ पढ़ें और इसमें खुद को विसर्जित करें और यह धीरे-धीरे आ जाएगा लेकिन – alex

+2

नम्रता के लिए +1 – FastAl

+0

यह भी देखें: http://stackoverflow.com/questions/1530868/सरल-स्पष्टीकरण-php-oop-vs-processural – dreftymac

उत्तर

0

मैं आपके जूते में रहा हूं, लेकिन मैंने इस पुस्तक को पढ़ने के बाद प्रकाश देखा (कुछ बार!) http://www.apress.com/book/view/9781590599099 इसे पढ़ने के बाद, मुझे वास्तव में "मिल गया" और मैंने वापस नहीं देखा है। आप इसे अमेज़ॅन पर प्राप्त करेंगे।

मुझे आशा है कि आप बने रहें, इसे प्राप्त करें और इसे प्यार करें। जब यह एक साथ आता है, तो यह आपको मुस्कान देगा।

संरचना उत्तराधिकारी धड़कता है।

+1

"संरचना विरासत धड़कता है": हे ओह नहीं तुमने नहीं किया! –

5

मैं Code Complete पढ़ने की सलाह देते। PHP ओओ पर कुछ लिंक बहुत अच्छे हैं, लेकिन यह विचार की रोटी और मक्खन में आता है।

+0

+ ∞ पर देख रहा है यदि मैं कोड पूर्ण करने के लिए कर सकता हूं। –

7

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

निश्चित रूप से "Tell, don't Ask" दर्शन पर ध्यान दें, और "ज्ञान की आवश्यकता" सिद्धांत (उर्फ "डेमेटर का कानून") एक बहुत ही महत्वपूर्ण है।

+0

अच्छा बिंदु! ओओपी-वाई और कक्षा-उपयोग कोड के हर टुकड़े को बनाने के लिए अक्सर दौड़ में भूल जाते हैं। –

33

एक चीज़ के बारे में सोचें। कोई चीज, एक चीज जो आप सामान करना चाहते हैं। कहो, नाश्ता

(सभी कोड स्यूडोकोड, किसी भी भाषा में रहने वाले के साथ कोई समानता, मृत, या चिकित्सकीय बैंकिंग उद्योग में दुरुपयोग किया जा रहा है पूरी तरह से संयोग और PHP कुछ भी नहीं अपनी पोस्ट के साथ क्या करना टैग किया जा रहा है)

तो तुम एक टेम्पलेट को परिभाषित आप कैसे नाश्ते का प्रतिनिधित्व करेंगे। यह एक वर्ग है:

class Breakfast { 

} 

नाश्ते में गुण होते हैं। सामान्य गैर वस्तु उन्मुख सामान में, आप इस के लिए एक सरणी का उपयोग हो सकता है:

$breakfast = array(
'toast_slices' => 2, 
'eggs' => 2, 
'egg_type' => 'fried', 
'beans' => 'Hell yeah', 
'bacon_rashers' => 3 
); 

और तुम इसके साथ नगण्य के लिए विभिन्न कार्यों होगा:

function does_user_want_beans($breakfast){ 
    if (isset($breakfast['beans']) && $breakfast['beans'] != 'Hell no'){ 
     return true; 
    } 
    return false; 
} 

और आप एक गड़बड़ मिल गया है , न सिर्फ बीन्स की वजह से। आपके पास डेटा संरचना है कि प्रोग्रामर इच्छाशक्ति के साथ स्क्रू कर सकते हैं, नाश्ते के साथ पूरी तरह से डेटा की परिभाषा से तलाक के साथ कार्यों का एक विस्तारित संग्रह। बजाय, आप यह कर सकता है:

$users = fetch_list_of_users(); 

foreach ($users as $user){ 
    // So this creates an instance of the Breakfast template we defined above 

    $breakfast = new Breakfast(); 

    if ($user->likesBacon){ 
     $breakfast->moar_magic_pig(4); 
    } 

    // If you find a PECL module that does this, Email me. 
    $breakfast->cook(); 
} 

मैं इस क्लीनर लग रहा है लगता है, और धब्बे का प्रतिनिधित्व करने के एक दूर neater तरीका:

class Breakfast { 
    var $toast_slices = 2; 
    var $eggs = 2; 
    var $egg_type = 'fried'; 
    var $beans = 'Hell yeah'; 
    var $bacon_rashers = 3; 

    function wants_beans(){ 

    if (isset($this->beans) && $this->beans != 'Hell no'){ 
     return true; 
    } 

    return true; 

    } 

    function moar_magic_pig($amount = 1){ 

    $this->bacon += $amount; 

    } 

    function cook(){ 
     breakfast_cook($this); 
    } 

} 

और फिर नाश्ता के कार्यक्रम के विचार से छेड़छाड़ एक बहुत क्लीनर बन जाता है डेटा हम एक सतत वस्तु के रूप में इलाज करना चाहते हैं।

ओओ वास्तव में क्या है, और यह अकादमिक रूप से बेहतर क्यों है, इसके बेहतर स्पष्टीकरण हैं, लेकिन यह मेरा व्यावहारिक कारण है, और इसमें बेकन शामिल है। xtofl.myopenid.com ^^^^

आप पैटर्न के प्रयोजनों के समझ में नहीं आता है, तो अपने वास्तव में नहीं उनकी पूर्णता के साथ वस्तुओं का उपयोग करने जा:

+4

कोई स्पष्टीकरण जिसमें चंकी बेकन शामिल है, मेरा वोट प्राप्त करता है;) – Aeon

+0

"अकादमिक रूप से बेहतर?" सभी प्रोग्रामिंग प्रतिमान अलग-अलग हैं और कुछ अलग-अलग स्थानों में बेहतर हैं, लेकिन कहने के लिए ओओपी प्रक्रियात्मक (या कार्यात्मक) से अकादमिक रूप से बेहतर है, यह उचित नहीं है। ओओपी डेटा को उनके तरीकों से सारणित करने के लिए बहुत कठिन बनाता है, उदाहरण के लिए –

+0

इफेस्ट के लिए प्लेट पर मैजिक स्टफ फ्लाइंग! +1 –

0

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

0

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

मैं क्यूकोडो PHP5 ढांचे http://www.qcodo.com की अनुशंसा करता हूं। इसमें इसे सेट अप करने के साथ-साथ वीडियो ट्रेनिंग (http://www.qcodo.com/demos/) पर शानदार वीडियो ट्यूटोरियल भी हैं।

पूर्ण प्रकटीकरण: मैं इस ढांचे के शीर्ष पर दो साल तक विकास कर रहा हूं, और मैंने अपने कोडबेस में कोड का योगदान दिया है (इसलिए मैं पूरी तरह से निष्पक्ष नहीं हूं :-))।

0

सीखने OO के लिए एक और सूचक:

अधिकांश OO ट्यूटोरियल विरासत पर ध्यान दिया जाएगा (जैसे दसवीं कक्षा फैली वर्ग वाई)। मुझे लगता है कि यह एक बुरा विचार है। विरासत उपयोगी है, लेकिन यह समस्याएं भी पैदा कर सकती है। सबसे महत्वपूर्ण बात यह है कि विरासत ओओ का मुद्दा नहीं है। बिंदु abstraction है; कार्यान्वयन विवरण छुपाएं ताकि आप एक साधारण इंटरफ़ेस के साथ काम कर सकें। अपने डेटा के अच्छे abstractions लिखने के लिए जानें, और आप अच्छे आकार में होंगे। विरासत सामान पसीना पसीना मत करो।

5

प्रमुख कारण से कुछ OO उपयोग करने के लिए हम मनुष्य कैसे अनुभव करते हैं और चीजों से संबंधित हैं, और अर्थव्यवस्था, रख-रखाव, विश्वसनीयता के लाभों का फायदा उठाने के लिए करना चाहते करने के लिए एक समान तरीके से कोड की संरचना करने के कर रहे हैं , और स्केलेबिलिटी

i.e: मानव जाति ने हजारों साल पहले पहिया को डिजाइन किया था। हम यह सब समय को परिष्कृत कर सकते हैं, लेकिन हम निश्चित रूप से किया जा इसे फिर से फिर से खोज करने की जरूरत नहीं है ....

1) हम वर्गीकृत करने के लिए चीजों की तरह है: "इस एक के इस एक से भी बड़ा" , "यह एक से अधिक खर्च करता है", "यह लगभग उसी जैसा ही है"।

2) हम आसान बनाने के लिए चीजों की तरह है: "ठीक है, यह एक वी 8 तरल ठंडा टर्बो संचालित ट्रैक्टर है, लेकिन मैं अभी भी बस स्टीयरिंग व्हील बारी और सही ड्राइव करना peddles पर मेरे पैर दबाते हैं, तो?" । "ठीक है, के त्रिकोण, हलकों, और वर्गों सभी आकृति कॉल, और उन सब एक क्षेत्र है और एक परिधि की अपेक्षा":

3) हम मानकीकृत करने के लिए चीजों की तरह।

4) हम अनुकूल करने के लिए चीजों की तरह है: "हममम, मुझे लगता है कि पसंद है, लेकिन मैं दौड़ ग्रीन में यह बजाय हो सकता है?"।

5) हम ब्लूप्रिंट बनाना चाहते हैं: "मैं समय या पैसे (या अनुमोदन) अभी तक निर्माण करने के लिए है कि नहीं मिला है, लेकिन यह एक दरवाजा और एक छत है, और कुछ खिड़कियों होगा, और दीवारों "। "ठीक है, मैं तुम्हें कुल कीमत को देखने दूँगा, लेकिन मैं मार्क-अप मैं आप से जोड़ा छुपा रहा हूँ!":

6) हम चीजों की रक्षा के लिए पसंद करते हैं।

7) हम एक दूसरे के साथ संवादके लिए चीजों की तरह है: "मैं के माध्यम से अपने बैंक बैलेंस का उपयोग करना चाहते हैं: अपने मोबाइल, अपने कंप्यूटर, एक एटीएम, एक बैंक कर्मचारी, आदि .."।

ओओ का शोषण करने के लिए सीखने के लिए (और कुछ फायदे देखें) तो मेरा सुझाव है कि आप स्वयं को होमवर्क के रूप में व्यायाम करें - शायद ब्राउज़र आधारित एप्लिकेशन जो शेप, सर्किल, और त्रिकोण जैसे SHAPES से संबंधित है, और ट्रैक रखता है उनके क्षेत्र, रंग, स्थिति, और जेड-इंडेक्स इत्यादि के बाद वर्गों को आयताकार के विशेष मामले के रूप में जोड़ें क्योंकि यह इसकी अधिकांश परिभाषा, क्षेत्र इत्यादि के संबंध में समान है। बस अतिरिक्त स्थिति है जहां ऊंचाई है चौड़ाई के समान। इसे कठिन बनाने के लिए आप आयत को एक प्रकार का चतुर्भुज बना सकते हैं जो बहुभुज का एक प्रकार है। इत्यादि।

नोट: मैं एक PHP फ्रेमवर्क का उपयोग शुरू नहीं करूँगा जब तक कि आप पहले ओओ प्रोग्रामिंग की मूल बातें के साथ सहज न हों। जब आप अपने स्वयं के वर्गों का विस्तार कर सकते हैं तो वे अधिक शक्तिशाली होते हैं और यदि आप नहीं कर सकते हैं तो यह कुछ सीखने जैसा है -> बहुत कठिन!

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