अध्याय 21: PHP में ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (Object-Oriented Programming in PHP)

अध्याय 21: PHP में ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (Object-Oriented Programming in PHP)

इस अध्याय में, हम PHP में ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (OOP) के मूल सिद्धांतों को समझेंगे। ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग एक प्रोग्रामिंग पैराडाइम है जो डेटा और उसके साथ संबंधित व्यवहार को एक इकाई के रूप में पैकेज करता है जिसे ऑब्जेक्ट कहा जाता है। OOP का उपयोग कोड को अधिक संगठित, पुन: प्रयोज्य, और मॉड्यूलर बनाने के लिए किया जाता है।

OOP के चार मुख्य सिद्धांत हैं: एन्कैप्सुलेशन (Encapsulation), इनहेरिटेंस (Inheritance), पॉलिमॉरफिज्म (Polymorphism), और एब्स्ट्रैक्शन (Abstraction)। इन सिद्धांतों को समझना और उनका सही उपयोग करना आपके कोड को अधिक कुशल और लचीला बनाता है।

इस अध्याय में, हम निम्नलिखित विषयों पर चर्चा करेंगे:

  • क्लास और ऑब्जेक्ट्स
  • गुण (Properties) और विधियाँ (Methods)
  • कंस्ट्रक्टर्स और डेस्ट्रक्टर्स
  • इनहेरिटेंस और पॉलिमॉरफिज्म
  • एब्स्ट्रैक्शन और इंटरफेसेस
  • PHP में OOP का उपयोग करके व्यावहारिक उदाहरण

इस अध्याय के अंत तक, आप PHP में ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के मूल सिद्धांतों को समझेंगे और उन्हें अपने प्रोजेक्ट्स में लागू करने में सक्षम होंगे।

OOP का परिचय (Introduction to OOP)

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

1. एन्कैप्सुलेशन (Encapsulation)

एन्कैप्सुलेशन का मतलब है डेटा और विधियों (methods) को एक क्लास के अंदर छुपाना। यह बाहरी कोड को डेटा को सीधे एक्सेस करने से रोकता है और इंटरफेस के माध्यम से डेटा को एक्सेस और संशोधित करने की अनुमति देता है।

उदाहरण:

<?php
class Person {
    private $name;

    public function setName($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

$person = new Person();
$person->setName("John Doe");
echo $person->getName(); // आउटपुट: John Doe
?>

इस उदाहरण में, $name प्रॉपर्टी को private किया गया है, इसलिए इसे क्लास के बाहर से सीधे एक्सेस नहीं किया जा सकता। इसके बजाय, setName() और getName() विधियों का उपयोग करके नाम सेट और प्राप्त किया जाता है।

2. इनहेरिटेंस (Inheritance)

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

उदाहरण:

<?php
class Animal {
    public function makeSound() {
        echo "Animal sound";
    }
}

class Dog extends Animal {
    public function makeSound() {
        echo "Bark";
    }
}

$dog = new Dog();
$dog->makeSound(); // आउटपुट: Bark
?>

इस उदाहरण में, Dog क्लास Animal क्लास से विरासत में प्राप्त होती है और makeSound() विधि को ओवरराइड करती है।

3. पॉलिमॉरफिज्म (Polymorphism)

पॉलिमॉरफिज्म का मतलब है कि एक ही विधि अलग-अलग क्लासेस में अलग-अलग व्यवहार कर सकती है। यह विधियों को ओवरराइड करने और इंटरफेस का उपयोग करने के माध्यम से हासिल किया जाता है।

उदाहरण:

<?php
class Animal {
    public function makeSound() {
        echo "Animal sound";
    }
}

class Cat extends Animal {
    public function makeSound() {
        echo "Meow";
    }
}

class Dog extends Animal {
    public function makeSound() {
        echo "Bark";
    }
}

function makeAnimalSound(Animal $animal) {
    $animal->makeSound();
}

$cat = new Cat();
$dog = new Dog();

makeAnimalSound($cat); // आउटपुट: Meow
makeAnimalSound($dog); // आउटपुट: Bark
?>

इस उदाहरण में, makeAnimalSound() फ़ंक्शन किसी भी Animal क्लास की ऑब्जेक्ट को एक्सेप्ट करता है और सही तरीके से makeSound() विधि को कॉल करता है।

4. एब्स्ट्रैक्शन (Abstraction)

एब्स्ट्रैक्शन का मतलब है कि जटिलता को छुपाकर उपयोगकर्ता को एक सरल इंटरफेस प्रदान करना। यह एब्स्ट्रैक्ट क्लासेस और इंटरफेसेस के माध्यम से हासिल किया जाता है।

उदाहरण:

<?php
abstract class Shape {
    abstract public function area();
}

class Circle extends Shape {
    private $radius;

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

    public function area() {
        return pi() * pow($this->radius, 2);
    }
}

$circle = new Circle(5);
echo $circle->area(); // आउटपुट: 78.539816339745
?>

इस उदाहरण में, Shape एक एब्स्ट्रैक्ट क्लास है जिसमें area() एब्स्ट्रैक्ट विधि है। Circle क्लास इस एब्स्ट्रैक्ट क्लास को एक्सटेंड करती है और area() विधि को इम्प्लीमेंट करती है।

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

क्लासेस और ऑब्जेक्ट्स (Classes and Objects)

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (OOP) का आधार क्लासेस और ऑब्जेक्ट्स हैं। एक क्लास एक ब्लूप्रिंट या टेम्पलेट है जो ऑब्जेक्ट्स को बनाने के लिए उपयोग किया जाता है। ऑब्जेक्ट्स क्लास के इंस्टेंस होते हैं और क्लास में परिभाषित गुणों (properties) और विधियों (methods) का उपयोग कर सकते हैं।

क्लास का परिचय (Introduction to Classes)

क्लास एक टेम्पलेट है जो गुणों और विधियों को परिभाषित करता है। क्लास का उपयोग करके आप कई ऑब्जेक्ट्स बना सकते हैं, जो समान गुणों और विधियों को साझा करते हैं।

सिंटैक्स:

<?php
class ClassName {
    // गुण (Properties)
    public $property;

    // विधि (Method)
    public function method() {
        // कोड
    }
}
?>

ऑब्जेक्ट्स का परिचय (Introduction to Objects)

ऑब्जेक्ट एक क्लास का इंस्टेंस होता है। जब आप किसी क्लास को इंस्टेंटिएट करते हैं, तो आप एक ऑब्जेक्ट बनाते हैं जो उस क्लास की सभी गुणों और विधियों का उपयोग कर सकता है।

सिंटैक्स:

<?php
// क्लास को इंस्टेंटिएट करना
$object = new ClassName();

// ऑब्जेक्ट का उपयोग करके गुण सेट करना
$object->property = "value";

// ऑब्जेक्ट का उपयोग करके विधि कॉल करना
$object->method();
?>

उदाहरण (Example)

<?php
class Car {
    // गुण
    public $make;
    public $model;

    // विधि
    public function displayInfo() {
        echo "Make: " . $this->make . "<br>";
        echo "Model: " . $this->model . "<br>";
    }
}

// क्लास को इंस्टेंटिएट करना
$car1 = new Car();
$car1->make = "Toyota";
$car1->model = "Corolla";
$car1->displayInfo();

$car2 = new Car();
$car2->make = "Honda";
$car2->model = "Civic";
$car2->displayInfo();
?>

इस उदाहरण में:

  • हमने Car नामक एक क्लास बनाई है जिसमें दो गुण (make और model) और एक विधि (displayInfo()) है।
  • Car क्लास को इंस्टेंटिएट करके दो ऑब्जेक्ट्स ($car1 और $car2) बनाए गए हैं।
  • प्रत्येक ऑब्जेक्ट के गुण सेट किए गए हैं और displayInfo() विधि का उपयोग करके जानकारी प्रदर्शित की गई है।

कंस्ट्रक्टर्स (Constructors)

कंस्ट्रक्टर एक विशेष विधि है जो तब कॉल होती है जब कोई ऑब्जेक्ट क्लास से इंस्टेंटिएट किया जाता है। इसका उपयोग गुणों को प्रारंभ करने के लिए किया जा सकता है।

उदाहरण:

<?php
class Car {
    public $make;
    public $model;

    // कंस्ट्रक्टर
    public function __construct($make, $model) {
        $this->make = $make;
        $this->model = $model;
    }

    public function displayInfo() {
        echo "Make: " . $this->make . "<br>";
        echo "Model: " . $this->model . "<br>";
    }
}

$car1 = new Car("Toyota", "Corolla");
$car1->displayInfo();

$car2 = new Car("Honda", "Civic");
$car2->displayInfo();
?>

इस उदाहरण में, __construct() विधि को कंस्ट्रक्टर के रूप में परिभाषित किया गया है और जब भी एक नया Car ऑब्जेक्ट बनाया जाता है, यह विधि स्वचालित रूप से कॉल होती है।

डेस्ट्रक्टर्स (Destructors)

डेस्ट्रक्टर एक विशेष विधि है जो तब कॉल होती है जब ऑब्जेक्ट नष्ट किया जाता है या स्क्रिप्ट समाप्त होती है। इसका उपयोग क्लीनअप ऑपरेशन्स के लिए किया जा सकता है।

उदाहरण:

<?php
class Car {
    public $make;
    public $model;

    public function __construct($make, $model) {
        $this->make = $make;
        $this->model = $model;
    }

    public function __destruct() {
        echo "The object of " . $this->make . " " . $this->model . " is destroyed.<br>";
    }

    public function displayInfo() {
        echo "Make: " . $this->make . "<br>";
        echo "Model: " . $this->model . "<br>";
    }
}

$car1 = new Car("Toyota", "Corolla");
$car1->displayInfo();

$car2 = new Car("Honda", "Civic");
$car2->displayInfo();
?>

इस उदाहरण में, __destruct() विधि को डेस्ट्रक्टर के रूप में परिभाषित किया गया है और यह तब कॉल होती है जब ऑब्जेक्ट नष्ट होता है।

संक्षेप (Summary)

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

इनहेरिटेंस और पॉलिमॉर्फिज्म (Inheritance and Polymorphism)

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (OOP) में, इनहेरिटेंस और पॉलिमॉर्फिज्म दो महत्वपूर्ण सिद्धांत हैं जो कोड को पुन: प्रयोज्य और लचीला बनाने में मदद करते हैं। इनहेरिटेंस का उपयोग करके, एक क्लास दूसरी क्लास से गुण और विधियाँ विरासत में प्राप्त कर सकती है। पॉलिमॉर्फिज्म का उपयोग करके, एक ही विधि विभिन्न क्लासेस में अलग-अलग व्यवहार कर सकती है।

इनहेरिटेंस (Inheritance)

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

उदाहरण:

<?php
class Animal {
    public $name;

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

    public function makeSound() {
        echo "Some generic animal sound";
    }
}

class Dog extends Animal {
    public function makeSound() {
        echo "Bark";
    }
}

class Cat extends Animal {
    public function makeSound() {
        echo "Meow";
    }
}

$dog = new Dog("Buddy");
$cat = new Cat("Whiskers");

echo $dog->name . ": ";
$dog->makeSound(); // आउटपुट: Bark

echo "<br>";

echo $cat->name . ": ";
$cat->makeSound(); // आउटपुट: Meow
?>

इस उदाहरण में:

  • Animal क्लास में एक गुण (name) और एक विधि (makeSound()) है।
  • Dog और Cat क्लासेस Animal क्लास को विरासत में प्राप्त करती हैं और अपनी खुद की makeSound() विधि को ओवरराइड करती हैं।
  • Dog और Cat क्लासेस के ऑब्जेक्ट्स बनाए जाते हैं और उनके गुण और विधियाँ उपयोग की जाती हैं।

पॉलिमॉर्फिज्म (Polymorphism)

पॉलिमॉर्फिज्म का मतलब है कि एक ही विधि विभिन्न क्लासेस में अलग-अलग व्यवहार कर सकती है। यह विधियों को ओवरराइड करने और इंटरफेसेस का उपयोग करने के माध्यम से हासिल किया जाता है। पॉलिमॉर्फिज्म का मुख्य लाभ यह है कि कोड अधिक लचीला और पुन: प्रयोज्य हो जाता है।

उदाहरण:

<?php
class Animal {
    public function makeSound() {
        echo "Some generic animal sound";
    }
}

class Dog extends Animal {
    public function makeSound() {
        echo "Bark";
    }
}

class Cat extends Animal {
    public function makeSound() {
        echo "Meow";
    }
}

function makeAnimalSound(Animal $animal) {
    $animal->makeSound();
}

$dog = new Dog();
$cat = new Cat();

makeAnimalSound($dog); // आउटपुट: Bark
echo "<br>";
makeAnimalSound($cat); // आउटपुट: Meow
?>

इस उदाहरण में:

  • Animal क्लास में makeSound() विधि है।
  • Dog और Cat क्लासेस Animal क्लास को विरासत में प्राप्त करती हैं और अपनी खुद की makeSound() विधि को ओवरराइड करती हैं।
  • makeAnimalSound() फ़ंक्शन किसी भी Animal क्लास के ऑब्जेक्ट को एक्सेप्ट करता है और सही तरीके से makeSound() विधि को कॉल करता है।

इंटरफेसेस का उपयोग (Using Interfaces)

इंटरफेसेस का उपयोग करके, आप एक अनुबंध परिभाषित कर सकते हैं जिसे एक या एक से अधिक क्लासेस को इम्प्लीमेंट करना होता है। इंटरफेसेस पॉलिमॉर्फिज्म को प्राप्त करने का एक तरीका हैं।

उदाहरण:

इस उदाहरण में:

  • AnimalInterface एक इंटरफेस है जिसमें makeSound() विधि परिभाषित है।
  • Dog और Cat क्लासेस इस इंटरफेस को इम्प्लीमेंट करती हैं और अपनी खुद की makeSound() विधि को परिभाषित करती हैं।
  • makeAnimalSound() फ़ंक्शन किसी भी AnimalInterface को एक्सेप्ट करता है और सही तरीके से makeSound() विधि को कॉल करता है।

संक्षेप (Summary)

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

Traits in PHP

Traits एक विशेषता है जिसे PHP में PHP 5.4 से परिचित कराया गया है। Traits का उपयोग कोड को पुन: प्रयोज्य बनाने और क्लासेस में विशेषताओं को साझा करने के लिए किया जाता है। Traits का उपयोग उन स्थितियों में किया जाता है जहां आप एक ही कोड को कई क्लासेस में उपयोग करना चाहते हैं, लेकिन इनहेरिटेंस का उपयोग नहीं कर सकते।

Traits का परिचय (Introduction to Traits)

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

सिंटैक्स:

<?php
trait TraitName {
    // प्रॉपर्टीज और मेथड्स
}
?>

उदाहरण (Example)

मान लीजिए कि हमारे पास दो क्लासेस हैं: Dog और Cat, और हम दोनों में कुछ समान मेथड्स और प्रॉपर्टीज़ का उपयोग करना चाहते हैं। Traits का उपयोग करके, हम इन मेथड्स और प्रॉपर्टीज़ को एक बार परिभाषित कर सकते हैं और दोनों क्लासेस में साझा कर सकते हैं।

<?php
trait AnimalTrait {
    public function eat() {
        echo "Eating...<br>";
    }

    public function sleep() {
        echo "Sleeping...<br>";
    }
}

class Dog {
    use AnimalTrait;

    public function bark() {
        echo "Barking...<br>";
    }
}

class Cat {
    use AnimalTrait;

    public function meow() {
        echo "Meowing...<br>";
    }
}

$dog = new Dog();
$dog->eat();
$dog->sleep();
$dog->bark();

$cat = new Cat();
$cat->eat();
$cat->sleep();
$cat->meow();
?>

इस उदाहरण में:

  • AnimalTrait नामक एक Trait परिभाषित किया गया है जिसमें eat() और sleep() मेथड्स शामिल हैं।
  • Dog और Cat क्लासेस में use कीवर्ड का उपयोग करके AnimalTrait को शामिल किया गया है।
  • Dog और Cat क्लासेस के ऑब्जेक्ट्स बनाए गए हैं और उनमें AnimalTrait के मेथड्स का उपयोग किया गया है।

Traits के साथ प्रॉपर्टीज (Properties with Traits)

Traits का उपयोग मेथड्स के साथ-साथ प्रॉपर्टीज़ को साझा करने के लिए भी किया जा सकता है।

उदाहरण:

<?php
trait AnimalTrait {
    public $name;

    public function setName($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

class Dog {
    use AnimalTrait;

    public function bark() {
        echo $this->name . " is barking...<br>";
    }
}

$dog = new Dog();
$dog->setName("Buddy");
echo $dog->getName() . "<br>"; // आउटपुट: Buddy
$dog->bark(); // आउटपुट: Buddy is barking...
?>

ट्रेट्स में कन्फ्लिक्ट रेसोल्यूशन (Conflict Resolution in Traits)

कभी-कभी, Traits में नामों का टकराव हो सकता है। PHP आपको ट्रेट्स के भीतर कन्फ्लिक्ट रेसोल्यूशन करने की अनुमति देता है।

उदाहरण:

<?php
trait TraitA {
    public function method() {
        echo "Method from TraitA<br>";
    }
}

trait TraitB {
    public function method() {
        echo "Method from TraitB<br>";
    }
}

class MyClass {
    use TraitA, TraitB {
        TraitA::method insteadof TraitB;
        TraitB::method as methodFromTraitB;
    }
}

$obj = new MyClass();
$obj->method(); // आउटपुट: Method from TraitA
$obj->methodFromTraitB(); // आउटपुट: Method from TraitB
?>

इस उदाहरण में:

  • TraitA और TraitB दोनों में एक ही नाम की मेथड method() है।
  • MyClass क्लास में दोनों Traits का उपयोग किया गया है और कन्फ्लिक्ट रेसोल्यूशन किया गया है।
  • TraitA::method को प्राथमिकता दी गई है और TraitB::method को methodFromTraitB के नाम से उपयोग किया गया है।

संक्षेप (Summary)

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



Index