2009-08-27 25 views
43

मैं ओओपी सीखने की कोशिश कर रहा हूं। जिन पुस्तकों को मैं पढ़ रहा हूं उनमें तथाकथित 'असली दुनिया' उदाहरण मदद नहीं कर रहे हैं।PHP: असली दुनिया ओओपी उदाहरण

Pet, Car, Human जैसे सभी उदाहरण अब मेरी सहायता नहीं कर रहे हैं। मैं वास्तविक जीवन उदाहरण है कि पंजीकरण, उपयोगकर्ता प्रोफ़ाइल पृष्ठ, आदि की तरह की जरूरत है

एक उदाहरण:

$user->userName = $_POST['userName'];//save username 
$user->password = $_POST['password'];//save password 
$user->saveUser();//insert in database 

मैं भी देखा है:

$user->user = (array) $_POST; 

जहां:

private $user = array(); 

एक सरणी में सभी जानकारी रखता है।

और वह एक ही कक्षा के भीतर निहित है

$user->getUser($uid); 
// which sets the $this->user array equal to mysqli_fetch_assoc() using 
//the user id. 

वहाँ किसी भी वास्तविक दुनिया के कई अलग अलग php अनुप्रयोगों में OOP को लागू करने उदाहरण (पंजीकरण, लॉगिन, उपयोगकर्ता खाते, आदि) कर रहे हैं?

+0

** कृपया यह भी देखें: ** "शब्दजाल से मुक्त तुलना OOP प्रक्रियात्मक बनाम": http://stackoverflow.com/questions/1530868 – dreftymac

उत्तर

77

ओओपी न केवल एक वर्ग कैसे दिखता है और संचालित करता है। यह भी एक या एक से अधिक कक्षाओं के उदाहरण एक साथ काम करते हैं।

इसलिए आप इतने सारे "कार" और "लोग" के आधार पर उदाहरण देखें क्योंकि वे वास्तव में इस सिद्धांत को दर्शाता हुआ का एक बहुत अच्छा काम करते हैं।

मेरी राय में, OOP में सबसे महत्वपूर्ण सबक कैप्सूलीकरण और बहुरूपता हैं।

Encapsulation: युग्मन डेटा और तर्क जो एक संक्षिप्त, तार्किक ढंग से एक साथ है कि डेटा पर कार्य करता है बहुरूपता: एक वस्तु देखने की तरह के लिए करने के लिए और/या व्यवहार करते हैं की तरह एक और क्षमता।

इसका एक अच्छा असली दुनिया उदाहरण एक निर्देशिका इटरेटर जैसा होगा। यह निर्देशिका कहां है? शायद यह एक स्थानीय फ़ोल्डर है, शायद यह एक FTP सर्वर की तरह दूरस्थ है। कौन जाने!

<?php 

interface DirectoryIteratorInterface 
{ 
    /** 
    * @return \Traversable|array 
    */ 
    public function listDirs(); 
} 

abstract class AbstractDirectoryIterator implements DirectoryIteratorInterface 
{ 
    protected $root; 

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

class LocalDirectoryIterator extends AbstractDirectoryIterator 
{ 
    public function listDirs() 
    { 
     // logic to get the current directory nodes and return them 
    } 
} 

class FtpDirectoryIterator extends AbstractDirectoryIterator 
{ 
    public function listDirs() 
    { 
     // logic to get the current directory nodes and return them 
    } 
} 

प्रत्येक वर्ग/वस्तु निर्देशिका प्रविष्टि पुन: प्राप्त करने का अपना ही विधि के लिए जिम्मेदार है:

यहाँ एक बुनियादी वर्ग पेड़ कि कैप्सूलीकरण दर्शाता है। डेटा (चर) तर्क के साथ मिलकर (क्लास फ़ंक्शन i.e, विधियों) हैं जो डेटा का उपयोग करते हैं।

लेकिन कहानी खत्म नहीं हुई है - याद रखें कि मैंने कहा कि ओओपी कैसे कक्षाओं के उदाहरण एक साथ काम करते हैं, और कोई भी वर्ग या वस्तु नहीं?

ठीक है, तो चलिए इस डेटा के साथ कुछ करते हैं - इसे स्क्रीन पर प्रिंट करें? ज़रूर। पर कैसे? एचटीएमएल? सादे पाठ? राष्ट्रीय स्वयंसेवक संघ? आइए इसे संबोधित करें।

<?php 

interface DirectoryRendererInterface 
{ 
    public function render(); 
} 

abstract class AbstractDirectoryRenderer implements DirectoryRendererInterface 
{ 
    protected $iterator; 

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

    public function render() 
    { 
     $dirs = $this->iterator->listDirs(); 
     foreach ($dirs as $dir) { 
      $this->renderDirectory($dir); 
     } 
    } 

    abstract protected function renderDirectory($directory); 
} 

class PlainTextDirectoryRenderer extends AbstractDirectoryRenderer 
{ 
    protected function renderDirectory($directory) 
    { 
     echo $directory, "\n"; 
    } 
} 

class HtmlDirectoryRenderer extends AbstractDirectoryRenderer 
{ 
    protected function renderDirectory($directory) 
    { 
     echo $directory, "<br>"; 
    } 
} 

ठीक है, अब हमारे पास निर्देशिका सूचियों को घुमाने और प्रस्तुत करने के लिए दो क्लास पेड़ हैं। हम उनका उपयोग कैसे करते हैं?

// Print a remote directory as HTML 
$data = new HtmlDirectoryRenderer(
    new FtpDirectoryIterator('ftp://example.com/path') 
); 
$data->render(); 

// Print a local directory a plain text 
$data = new PlainTextDirectoryRenderer(
    new LocalDirectoryIterator('/home/pbailey') 
); 
$data->render(); 

अब, मुझे पता है कि आप क्या सोच रहे हैं, "लेकिन पीटर, मुझे ऐसा करने के लिए इन बड़े वर्ग के पेड़ों की आवश्यकता नहीं है!" लेकिन अगर आपको लगता है कि तो आप बिंदु खो रहे हैं, मुझे लगता है कि आप "कार" और "लोग" उदाहरणों के साथ हैं। उदाहरण के minutiae पर ध्यान केंद्रित न करें - इसके बजाय यह समझने की कोशिश करें कि यहां क्या हो रहा है। यह अक्सर एक अनुबंध के रूप में जाना जाता है -

हम दो वर्ग पेड़ जहां एक (*DirectoryRenderer) एक उम्मीद तरह से अन्य (*DirectoryIterator) का उपयोग करता बना लिया है। *DirectoryRenderer का एक उदाहरण इस बात की परवाह नहीं करता कि *DirectoryIterator का किस प्रकार का उदाहरण प्राप्त होता है, न ही *DirectoryIterator के उदाहरणों को देखते हैं कि उन्हें कैसे प्रदान किया जा रहा है।

क्यों? क्योंकि हमने उन्हें इस तरह से डिजाइन किया है। वे सिर्फ एक-दूसरे में काम करते हैं और काम करते हैं। यह कार्रवाई में ओओपी है।

+11

+2 अगर मैं कर सकता था !! –

+0

उपयोगकर्ताओं के लिए कुछ उदाहरण है ?? मैं प्रबंधन और प्रमाणीकरण के लिए एक उदाहरण की कामना करता हूं। अगर कोई कहीं कहीं जानता है, तो मैं इसकी सराहना करता हूं। – iLevi

+0

@ पीटर बेली दुर्भाग्यवश मेरा प्रश्न बंद कर दिया गया है, लेकिन अगर आप [इस सवाल (यहां लिंक) के साथ मेरी मदद कर सकते हैं तो मुझे बहुत खुशी होगी (http://stackoverflow.com/questions/14221240/practical-way-to-implement -oop-in-php-for-users # comment19725375_14221240) – iLevi

1

जैसा कि खगोलीय ने कहा, आप एक अच्छे PHP ढांचे या पुस्तकालय के स्रोत कोड पर एक नज़र डाल सकते हैं। मैं Zend Framework की अनुशंसा करता हूं, यह बहुत मॉड्यूलर है और इसमें एक महान, पेशेवर डिजाइन है। मैं कहूंगा कि यह ऑब्जेक्ट उन्मुख PHP कोड का एक बहुत अच्छा टुकड़ा है।

फिर भी, मुझे लगता है कि, उत्पादन कोड का एक विशाल टुकड़ा से जानने के लिए के बाद से यह वास्तव में आप कुछ भी सिखाने के लिए नहीं किया गया था कि आसान नहीं है। लेकिन यदि आप असली दुनिया ऑब्जेक्ट उन्मुख PHP कोड चाहते हैं, तो ज़ेंड फ्रेमवर्क (या सिम्फनी, या शायद केकेपीएचपी) शायद जाने का तरीका है।

1

मैं, इस पल में किसी भी ढांचे से दूर रहने की अगर आप OOP नहीं जानते कि तुम सलाह देंगे, Zend या किसी अन्य ढांचे बहुत ज्यादा होगा की खुदाई।

पीएचपी OOP अजीब छोड़ जाता है ... की तरह हा हा हास्यास्पद है, क्योंकि यह समर्थित है, लेकिन पीएचपी जावा या सी # की तरह एक OOP भाषा नहीं है।

लघु उदाहरण बस अपना बयान को रेखांकित करने के:

// define class 
class User { 
// define properties and methods 
public $name = ""; 
} 
// instantiate class 
$user = new User; // or new User() or new user, it's all the same 
echo $user->name; 

लेकिन यदि आप "मक्खी पर" OOP क्या करना चाहते हैं तो आप निम्न कर सकते हैं:

$user = (object) array('name' => 'Peter'); 

और फिर

$user->name; 

लेकिन आप ओओपी का उपयोग कर सकते हैं जैसे आप जावा या सी # में करेंगे, लेकिन समान विस्तार के लिए नहीं - और ध्यान में रखें, लोकप्रिय सिस्टम जैसे वर्डप्रेस और ड्रूपल शुद्ध ओओपी नहीं हैं! लेकिन आप PHP में विरासत और अन्य वर्गीकरण ओओपी सामान भी कर सकते हैं।

+13

मैं माफी चाहता हूँ, लेकिन '$ उपयोगकर्ता = (वस्तु) सरणी ('नाम' => 'पीटर'); '* नहीं * ओओपी - या जैसा कि आप कहते हैं" फ्लाई पर ओओपी "। यह सिर्फ एक वस्तु है। वस्तुओं का उपयोग करना! = ओओपी। स्पष्ट रूप से वस्तुओं का उपयोग ओओपी का एक अभिन्न अंग है, लेकिन इसके बारे में * तरीका * उससे अधिक है। –

7

"डमीज़ के लिए PHP और MySQL रोज़ाना ऐप्स" जैसी पुस्तक खरीदें।

इसकी पुरानी मुझे पता है [2005] लेकिन यह माइस्क्ली के साथ प्रसंस्कृत और ऑब्जेक्ट ओरिएंटेड दोनों में उपयोगकर्ता लॉगिन, फोरम, शॉपिंग कार्ट आदि की अवधारणाओं को दिखाता है।

इससे मुझे ऑब्जेक्ट ओरिएंटेड PHP सीखने में मदद मिली, मैंने इसका अध्ययन किया। पैसे के लायक है।

ओओपी पुन: उपयोग करने योग्य टुकड़ों में आपके प्रोग्राम के समूहबद्ध बिट्स की तरह है। यह आपके साथ ईमानदार होना मुश्किल नहीं है बल्कि कक्षाओं में अपने कार्यों को पैक करने का विचार है।

रियल दुनिया नीचे OOP सामान का छोटा उदाहरण:

कक्षा डाटाबेस
कक्षा सत्र
कक्षा वेबफ़ॉर्म
विश्वस्तरीय ईमेल

कक्षा खातों (नीचे उदाहरण कार्य)
फंक्शन SELECTACCOUNT
फंक्शन CHECKPASSWORD
फ़ंक्शन CHECKUSERNAME
फ़ंक्शन CREATEACCOUNT

मुझे आशा है कि आप इसे बनाए रखें, PHP 6 को पहले से कहीं अधिक ओओपी का समर्थन करने के लिए फिर से इंजीनियर किया जाएगा।

शुभकामनाएं!

1

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

Here पुस्तक PHP और MySQL हर रोज Apps For Dummies

1

जबकि मुझे पता है कि इस सवाल का पहले से ही उत्तर दिया गया है के लिए एक लिंक है ..., मैं जैसे कि लग रहा है मैं यहां मूल्य जोड़ सकता हूं।

मुझे विश्वास नहीं है कि आपको ओओपी सीखने के लिए प्रोग्रामिंग भाषा के रूप में PHP का उपयोग करना चाहिए। यदि आप वेब अनुप्रयोगों के लिए ओओपी सीखना चाहते हैं, तो आपको वास्तव में सी # या जावा देखना चाहिए। एक बार जब आप ओओपी सीख चुके हैं, तो आप इस ज्ञान को PHP पर लागू कर सकते हैं। ओओपी सीखने के लिए इस्तेमाल की जाने वाली पुस्तक का एक उदाहरण Big Java by Cay S. Horstmann

मैं यह क्यों कहूं ??? चूंकि सामानों को कैसे करना है, इस बारे में PHP पर सचमुच लाखों उदाहरण हैं, हालांकि कई प्रोग्राम सही तरीके से प्रोग्राम करने के उदाहरण हैं। इसके अलावा, PHP आपको कई शॉर्टकट लेने की अनुमति देता है, जो जावा की पसंद के साथ स्वीकार्य नहीं होगा। इस प्रकार, यदि आप जावा हेड के साथ PHP प्रोग्राम करते हैं, तो मुझे विश्वास है कि आप एक मजबूत प्रोग्रामर होंगे। ओओपी भाषा विशिष्ट नहीं है, यह एक प्रोग्रामिंग प्रतिमान है।

यदि आपको PHP का उपयोग करके ओओपी सीखना है, तो मैं अनुशंसा करता हूं कि आप गीथब के सार्वजनिक भंडारों में कुछ वास्तविक स्रोत कोड देखें। आप उन्हें packagist.org में खोज सकते हैं। यदि वे एक सभ्य सार्वजनिक भंडार हैं, तो उनमें एक readme.md फ़ाइल होगी जो आपको दिखाएगी कि संगीतकार पैकेज का उपयोग कैसे करें। उदाहरण https://github.com/moltin/laravel-cart एक शॉपिंग कार्ट पैकेज का एक उदाहरण है जिसे आप अपने आवेदन में उपयोग करने में सक्षम होंगे। ध्यान दें कि संकुल क्या करते हैं, यह समझने के लिए आपको पैकेज स्रोत कोड को देखने की आवश्यकता नहीं है। पैकेज लिखा गया है, और आप इस बात पर परवाह नहीं करते कि वे कैसे काम करते हैं, लेकिन आप उनका उपयोग करते हैं ताकि आपको केवल यह जानने की आवश्यकता हो कि उनका उपयोग कैसे किया जाए। यह वही है जो ओओपी के बारे में है।

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

हालांकि आप क्या कर रहे हैं, यह समझने के लिए कि ओओपी कैसे काम करता है, स्रोत कोड में डाइविंग कर रहा है।

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

एमवीसी डिजाइन पैटर्न मॉडल, व्यू, कंट्रोलर के लिए खड़ा है। वेब अनुप्रयोग के मामले में, मॉडल डेटाबेस को मॉडलिंग के लिए ज़िम्मेदार है, दृश्य उपयोगकर्ता को सामग्री प्रदर्शित करने के लिए ज़िम्मेदार है। नियंत्रक मॉडल के साथ बातचीत करने और उपयोगकर्ता इनपुट को संभालने के लिए ज़िम्मेदार है।

मुझे लगता है कि आपको अपनी स्थानीय मशीन पर Laravel Framework या अन्य "सभ्य आधुनिक ढांचे" को स्थापित करने का प्रयास करना चाहिए। मैं आधुनिक क्यों कहता हूं, क्योंकि आधुनिक ढांचे के लिए 5.3+ के एक न्यूनतम PHP संस्करण की आवश्यकता होती है जिसका अर्थ है कि आपकी मशीन पर PHP वास्तविक ओओपी का समर्थन करेगा जो आपको जावा की पसंद से प्राप्त होगा।

कई ट्यूटोरियल हैं जो आपको दिखाएंगे कि लार्वेल में वेब एप्लिकेशन कैसे बनाएं। तत्काल, आप देखेंगे कि जब आप नियंत्रक बनाते हैं, तो आप बेसकंट्रोलर का विस्तार करते हैं। जब आप कोई मॉडल बनाते हैं, तो आप eloquent का विस्तार करते हैं। इसका मतलब है कि आप पहले से ही अपने कोड में पॉलिमॉर्फिज्म का उपयोग करेंगे। आप देखेंगे कि कक्षाओं का उपयोग करके, उन्हें encapsulated किया जा रहा है, और आप देखेंगे कि प्रत्येक वर्ग की एक विशिष्ट भूमिका है।

जब आप डेटाबेस से बातचीत करना चाहते हैं, तो आप प्रारंभ में नियंत्रक विधियों के भीतर new Model ऑब्जेक्ट बनायेंगे। जैसे ही आप और जानना शुरू करते हैं, आप सीखना शुरू कर देंगे कि कैसे नियंत्रक में निर्भरता को इंजेक्ट करना है, फिर सीखना कि कैसे अपने मॉडल को डंप करना और रिपॉजिटरीज़ और प्रोग्राम को इसके बजाय इंटरफ़ेस बनाना है।

शुरुआती के लिए लारवेल सीखने पर एक सभ्य पुस्तक https://leanpub.com/codebright डेल रीस द्वारा होगी। मैं लगभग 2 हफ्ते पहले लार्वेल मीटिंग में डेल से मिला था।

इसके अलावा इस के लिए

, जैसा कि आप और अधिक कुशल निर्माण वेब अनुप्रयोगों हो जाते हैं, आप जानने के लिए कैसे अपने प्रोग्रामिंग करने के लिए निम्नलिखित सिद्धांतों को लागू करने शुरू कर देंगे:

  • एकल जिम्मेदारी सिद्धांत
  • ओपन बंद सिद्धांत
  • लिस्कोव प्रतिस्थापन सिद्धांत
  • इंटरफ़ेस सेगमेंट सिद्धांत
  • निर्भरता उलटा सिद्धांत
0

मैं अपने रैपर Arrayzy को देखने का भी सुझाव देता हूं। यह ओओपी तरीके से एक देशी PHP सरणी आसान हेरफेर लाइब्रेरी है।

तो अगर आप देशी पीएचपी सरणी कार्यों के साथ काम करते हैं - आप OOP में ही बातें कर सकता है और Arrayzy इसके साथ आप में मदद करता है, उदाहरण के लिए:

// Functional programming: 
$array = ['a', 'b', 'c']; 
$resultArray = array_merge($array, ['c', 'd']); 

और

// Object-oriented programming: 
$obj = Arrayzy\MutableArray::create(['a', 'b', 'c']); 
$obj->mergeWith(['c', 'd']); 
$resultArray = $obj->toArray(); 

दोनों ही मामलों में परिणाम सरणी होगा:

Array(
    0 => 'a' 
    1 => 'b' 
    2 => 'c' 
    3 => 'c' 
    4 => 'd' 
) 

चेक कैसे इस mergeWith विधि (या अन्य) करता है हुड के नीचे काम करता है।

मुझे लगता है कि यह एक अच्छा उदाहरण से पता चलता है कि लगभग सब कुछ कार्यात्मक कोड आप इस लाइब्रेरी जैसे स्थानों कोड OOP के साथ बदलें सकता है। लेकिन ओओपी के साथ आपको अधिक मिलते हैं और आप Functional programming vs OOP प्रश्न भी देख सकते हैं ताकि अधिक जानकारी प्राप्त हो सके कि इसका क्या विपक्ष और प्रोप है।

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