2010-02-05 15 views
64

मुझे किसी पुस्तक से PHP कक्षाओं को समझने में गंभीर समस्याएं आ रही हैं। वे बहुत मुश्किल लगते हैं। उनका उद्देश्य क्या है और वे कैसे काम करते हैं?PHP में कक्षा क्या है?

उत्तर

193

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

namespace MyExample; 

class Lock 
{ 
    private $isLocked = false; 

    public function unlock() 
    { 
     $this->isLocked = false; 
     echo 'You unlocked the Lock'; 
    } 
    public function lock() 
    { 
     $this->isLocked = true; 
     echo 'You locked the Lock'; 
    } 
    public function isLocked() 
    { 
     return $this->isLocked; 
    } 
} 

अभी namespace, private और public घोषणा पर ध्यान न दें:


एक लॉक की कल्पना करें।

लॉक क्लास आपके आवेदन में सभी ताले के लिए एक ब्लूप्रिंट है। एक लॉक या तो बंद कर दिया या खुला, संपत्ति$isLocked द्वारा प्रतिनिधित्व किया जा सकता है। चूंकि इसमें केवल इन दो राज्य हो सकते हैं, इसलिए यह इंगित करने के लिए कि कौन सा राज्य लागू होता है, मैं एक बूलियन (true या false) का उपयोग करता हूं। मैं लॉक के माध्यम से विधियोंlock और unlock के माध्यम से बातचीत कर सकता हूं, जो तदनुसार राज्य को बदल देगा। isLocked विधि मुझे लॉक की वर्तमान स्थिति देगी। अब, जब आप इस ब्लूप्रिंट से ऑब्जेक्ट बनाते हैं (जिसे अक्सर इंस्टेंस) के रूप में भी जाना जाता है, तो यह अद्वितीय स्थिति को समाहित करेगा, उदा।

$aLock = new Lock; // Create object from the class blueprint 
$aLock->unlock(); // You unlocked the Lock 
$aLock->lock(); // You locked the Lock 

चलो एक और ताला बनाएँ, यह भी encapsulating यह अपने राज्य

$anotherLock = new Lock; 
$anotherLock->unlock(); // You unlocked the Lock 

है, लेकिन क्योंकि प्रत्येक वस्तु/उदाहरण समाहित यह पहली ताला

var_dump($aLock->isLocked());  // gives Boolean true 
var_dump($anotherLock->isLocked()); // gives Boolean false 

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

class Door 
{ 
    private $lock; 
    private $connectsTo; 

    public function __construct(Lock $lock) 
    { 
     $this->lock = $lock; 
     $this->connectsTo = 'bedroom'; 
    } 
    public function open() 
    { 
     if($this->lock->isLocked()) { 
      echo 'Cannot open Door. It is locked.'; 
     } else { 
      echo 'You opened the Door connecting to: ', $this->connectsTo; 
     } 
    } 
} 

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

class Chest 
{ 
    private $lock; 
    private $loot; 

    public function __construct(Lock $lock) 
    { 
     $this->lock = $lock; 
     $this->loot = 'Tons of Pieces of Eight'; 
    } 
    public function getLoot() 
    { 
     if($this->lock->isLocked()) { 
      echo 'Cannot get Loot. The chest is locked.'; 
     } else { 
      echo 'You looted the chest and got:', $this->loot; 
     } 
    } 
} 

उदाहरण के लिए आप देख सकते हैं नहीं है, छाती की reponsibility एक दरवाजे के उस से अलग है। एक छाती में लूट होता है, जबकि एक दरवाजा कमरे को अलग करता है। आप लॉक या अनलॉक किए गए राज्य को दोनों कक्षाओं में कोड कर सकते हैं, लेकिन एक अलग लॉक क्लास के साथ, आपको लॉक का पुन: उपयोग करने और पुन: उपयोग करने की आवश्यकता नहीं है।

$doorLock = new Lock; 
$myDoor = new Door($doorLock); 

$chestLock = new Lock; 
$myChest new Chest($chestLock); 

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

$quantumLock = new Lock; 
$myDoor = new Door($quantumLock); 
$myChest new Chest($quantumLock); 

और जब आप unlock()$quantumLock, दोनों दरवाजे और छाती को अनलॉक कर दिया जाएगा।

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

ध्यान दें कि ऊपर दिए गए उदाहरण दिखाते हैं कि lock() और unlock() विधियों का उपयोग करने के लिए चेस्ट या एक दरवाजा लॉक कैसे प्राप्त करें। मैं इसे आपके काम करने के लिए एक अभ्यास के रूप में छोड़ देता हूं (या जोड़ने के लिए कोई और)।

इसके अलावा वर्गों और वस्तुओं और कैसे का एक और अधिक में गहराई से स्पष्टीकरण के लिए जाँच When to use self over $this? उन्हें

कुछ अतिरिक्त संसाधनों के लिए साथ काम करने की जाँच

11

मैं तुम्हें एक संसाधन, नहीं एक स्पष्टीकरण के लिए कहा है, लेकिन यहाँ है कि मैं क्या वर्गों के बुनियादी कार्यान्वयन समझा द्वारा कुछ:

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

बिल्डिंग वर्ग:

/** 
* Constructs a building. 
*/ 
class Building 
{ 
    private $name; 
    private $height; 


    public function __construct($name, $height) 
    { 
     $this->name = $name; 
     $this->height = $height; 
    } 

    /** 
    * Returns name of building. 
    * 
    * @return string 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 


    public function elevatorUp() 
    { 
     // Implementation 
    } 


    public function elevatorDown() 
    { 
     // Implementation 
    } 


    public function lockDoor() 
    { 
     // Implementation 
    } 
} 

वर्ग कॉलिंग:

// Empire State Building 
$empireStateBuilding = new Building("Empire State Building", 381); 

echo $empireStateBuilding->getName(); 
$empireStateBuilding->lockDoor(); 


// Burj Khalifa 
$burjKhalifa = new Building("Burj Khalifa", 828); 

echo $burjKhalifa->getName(); 
$burjKhalifa->lockDoor(); 

बस उसे कॉपी, अपने स्थानीय होस्ट पर चला और कुछ परिवर्तन करने की कोशिश। किसी भी प्रश्न के मामले में, बस मुझसे पूछो। यदि आपको यह उपयोगी नहीं लगता है, तो पिछले पोस्टर्स के लिंक का उपयोग करें, वे सुंदर ठोस ट्यूटोरियल हैं।

2

एक अन्य कोण से एक दृश्य अगर मैं कर सकते हैं (व्यक्तिगत अनुभव के आधार पर) को खुश करने के लिए की पेशकश। आपको वास्तव में समझने से पहले "ओओपी की आवश्यकता" महसूस करने की आवश्यकता है - आईएमएचओ, सीखने के बाद संसाधनों को इसके बाद आना चाहिए।

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

बस मेरे दो सेंट।

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