Abstract Class in PHP

Abstract Class in PHP - Hindi

Abstract Class in PHP – कई बार ऐसी स्थितियां होती हैं, जब हम जो Base Class बनाते हैं, वह केवल एक General Class के रूप में ही Use हो सकती है। ऐसी Class के Direct Object Create नहीं किए जा सकते न ही किए जाने चाहिए। यदि हम ऐसी Class के Direct Object Create भी करते हैं, तो इन Object का कोई मतलब नहीं होता। ऐसी Class एक तरह से अधूरी Class होती है, जिसमें Declare किए गए सभी Methods को Define या Implement नहीं किया गया होता है।

उदाहरण के लिए हम एक Person नाम की Class Create कर सकते हैं, जिसमें किसी भी Person का Name, Date Of Birth, Contact, City, State आदि General Information हो सकती हैं। किसी भी Person को Uniquely Identify करने के लिए उसकी ये General Information जरूर होती हैं लेकिन हम Person नाम का कोई Object Create नहीं कर सकते।

Person कोई Employee हो सकता है, कोई Student या Teacher हो सकता है, कोई Doctor हो सकता है, लेकिन Person अपने आप में स्वयं कुछ नहीं होता। इसलिए वास्तव में Person नाम की Class के Direct Object Create ही नहीं किए जाने चाहिए।

इसी तरह से यदि हम एक Shape Class को देखें, तो Shape कोई Rectangle हो सकता है, Circle हो सकता है, Polygon हो सकता है, Square हो सकता है, लेकिन Shape स्वयं कुछ नहीं होता। इसलिए Shape Class के भी Direct Object नहीं Create किए जाने चाहिए।

यदि हम Person या Shape Class का Object Create करते हैं, तो इस प्रकार के Objects का कोई Real महत्व नहीं होता। इसलिए उपयुक्त तो यही रहता है कि हम इस प्रकार की General Class के Object Create ही न कर सकें।

एक ऐसी General Class जिसके सभी गुणों को उसकी सभी Sub Classes Share करें, लेकिन स्वयं उस General Class का Object ना Create किया जा सके, इस प्रकार की Class को Abstract Class कहते हैं।

एक Abstract Class को हमें हमेंशा Inherit करना ही होता है, क्योंकि इस प्रकार की Class में विभिन्न प्रकार के Methods को Declare तो किया जाता है, लेकिन उन्हें Implement या Define नहीं किया जाता है। बल्कि इन्हें उन Sub-Classes में Implement करने के लिए छोड दिया जाता है, जिन्हें इस प्रकार की Abstract Classes से Inherit किया जाता है।

चूंकि जिस तरह से हम सामान्य Class Create करते हैं, उसी तरह से हम Person या Shape नाम की Class भी Create कर सकते हैं और जिस तरह से हम सामान्य प्रकार की Classes के Object Create करते हैं, उसी तरह से हम इन Abstract Classes के Objects भी Create कर सकते हैं। जबकि वास्तव में ऐसा नहीं किया जाना चाहिए।

इसलिए PHP भी हमें अन्य OOPS आधारित Programming Languages की तरह किसी Class को Abstract बनाने की सुविधा देता है। यानी PHP में हम जिस Class को Abstract Class Declare करना चाहते हैं, उस Class के नाम से पहले हमें abstract Keyword का प्रयोग करना होता है।

PHP में जब हम किसी Class को Abstract Class बनाते हैं, तब हमें उस Class में कम से कम एक Method ऐसा बनाना जरूरी होता है जो कि स्वयं भी Abstract हो।

Abstract Method एक ऐसा Method होता है, जिसे Declare तो किया जाता है, लेकिन Define नहीं किया जाता। यानी ऐसे Method की Body नहीं होती। साथ ही हम जिस Method को Abstract Method के रूप में Define करना चाहते हैं, उस Method के साथ Prefix के रूप में हमें abstract Keyword का प्रयोग करना जरूरी होता है।

यानी एक Abstract Class बनाने के लिए हमें Class के नाम से पहले व उस Class में Define किए गए विभिन्न Methods में से किसी एक Method के नाम से पहले abstract Keyword का प्रयोग करना जरूरी होता है। इसी Keyword से PHP इस बात को Identify करता है कि Create की गई Class एक Abstract Class है और इस Class के Direct Object Create नहीं किए जा सकते।

जब हम किसी Class को Abstract Define कर देते हैं तब हम उस Class के Direct Object Create नहीं कर सकते। यदि हम किसी Abstract Class के Direct Object Create करने की कोशिश करते हैं, तो PHP हमें ऐसा नहीं करने देता।

जब हम किसी Class को Abstract बनाना चाहते हैं, तब हम उस Class में कम से कम एक Method को Abstract Define करते हैं। चूंकि Abstract Class को हमेंशा Inherit करना जरूरी होता है, इसलिए जब हम किसी Abstract Class को Inherit करते हैं, तब हमें उस Derived Class में इस Abstract Class के उस Unimplemented Method को Define करना जरूरी होता है, जिसे हमने Abstract Class में abstract Keyword के साथ Define किया है।

यदि हम Derived Class में Abstract Class के उस Abstract Method को Define न करें, तो बनने वाली Derived Class भी एक Abstract Class बन जाती है। यानी हम उस Derived Class के भी Object Create नहीं कर सकते।

उपरोक्त सभी Concepts को ठीक से समझने के लिए हम निम्नानुसार Person नाम की एक Class बना सकते हैं, जो कि एक Abstract Class हैः

<?php
	//Abstract Class
	abstract class Person{
		protected $name, $fname, $contactNo, $city, $state;
		
		abstract public function setData($name, $fname, $contactNo, $city, $state);
		abstract public function getData();
	}
	
	$rahul = new Person;
?>

यहां हमने Person नाम की जो Class Create की है, जिसमें दो Abstract Methods हैं, इसलिए इस Class के नाम से पहले भी हमनें abstract Keyword का प्रयोग किया है, क्योंकि ये एक Abstract Class है।

हालांकि हमने एक Abstract Class Crete की है, जिसके Direct Object Create नहीं किए जा सकते, फिर भी हमने $rahul नाम का एक Object Create करने की कोशिश की है। परिणामस्वरूप PHP हमें निम्न Fatal Error देता है, जो इस बात का Indication है कि हम किसी Abstract Class के Direct Object Create नहीं कर सकते।

//Output
PHP Fatal error:  Cannot instantiate abstract class Person in C:\wamp\www\phpInH
indi\001.php on line 10
PHP Stack trace:
PHP   1. {main}() C:\wamp\www\phpInHindi\001.php:0

Fatal error: Cannot instantiate abstract class Person in C:\wamp\www\phpInHindi\
001.php on line 10

Call Stack:
    0.0005     327168   1. {main}() C:\wamp\www\phpInHindi\001.php:0

चूंकि एक Abstract Class को हमेंशा Derive करना जरूरी होता है, इसलिए हम उपरोक्त Person Class से निम्नानुसार एक Employee Class Derive कर सकते हैं:

<?php
	//Abstract Class
	abstract class Person{
		protected $name, $fname, $contactNo, $city, $state;
		
		abstract public function setData($name, $fname, $contactNo, $city, $state); 
		abstract public function getData();
	}
	
	class Employee extends Person{
		public function setData($name, $fname, $contactNo, $city, $state){
			$this->name = $name;
			$this->fname = $fname;
			$this->contactNo = $contactNo;
			$this->city = $city;
			$this->state = $state;
		}
		
		public function display(){
			Echo "Name: " . $this->name . "\n";
			Echo "Father Name: " . $this->fname. "\n";
			Echo "Contact Number: " . $this->contactNo . "\n";
			Echo "City: " . $this->city . "\n";
			Echo "State: " . $this->state . "\n";
		}		
	}
	$rahul = new Employee;
	$rahul->setData('Sohan Lal', 'Mohan Lal', '9898989898', 'Falna', 'Rajasthan');
	$rahul->display();
?>

इस Program में हमने हालांकि Person नाम की Abstract Class को Employee नाम की Sub-Class में Derive कर लिया है, लेकिन हमने इस Derived Class में Base Class के केवल setData() Abstract Method को ही Define किया है, getData() Abstract Method को Define नहीं किया है।

परिणामस्वरूप जब हम $rahul नाम का Employee Type का Object Create करते हैं, तो भी PHP हमें Employee Type का भी Object Create नहीं करने देता। बल्कि निम्नानुसार Fatal Error Message देता हैः

PHP Fatal error:  Declaration of Employee::setData() must be compatible with that of Person::setData() in C:\wamp\www\phpInHindi\001.php on line 26

Fatal error: Declaration of Employee::setData() must be compatible with that of
Person::setData() in C:\wamp\www\phpInHindi\001.php on line 26

PHP हमें ऐसा Fatal Error Message इसलिए दे रहा है क्योंकि जैसाकि हमने पहले भी कहा कि Abstract Class के सभी Abstract Methods को Derived Class में Define करना जरूरी होता है और यदि हम एसा नहीं करते यानी Base Class के सभी Abstract Methods को यदि Derived Class में Define नहीं करते, तो बनने वाली Derived Class भी एक तरह से Abstract Class बन जाती है।

इसलिए यदि हम हमारे उपरोक्त Program को Normal तरीके से Run करना चाहते हैं, तो हमें getData() Method को भी Employee Class में Define करना जरूरी हैं।

लेकिन मानलो कि हमें getData() Method की Derived Class में जरूरत ही नहीं है, इसीलिए हम इस Method को Derived Class में Define नहीं करना चाहते, जबकि Base Class में इस Method के Abstract होने की वजह से इस Method को Derived Class में Define करना जरूरी है।

इस स्थिति में जरूरी नहीं है कि इस Method के Definition में किसी भी तरह का Code लिखें। यदि हम इस Method की केवल Body Create कर दें, तो PHP संतुष्‍ट हो जाता है। यानी उपरोक्त Program को Normal तरीके से Run करने के लिए हम उपरोक्त Program को निम्नानुसार भी Modify कर सकते हैं, जिसमें getData() Method में हमने एक भी Line का Code नहीं लिखा हैः

<?php
	//Abstract Class
	abstract class Person{
		protected $name, $fname, $contactNo, $city, $state;
		
		abstract public function setData($name, $fname, $contactNo, $city, $state); 
		abstract public function getData();
	}
	
	class Employee extends Person{
		public function setData($name, $fname, $contactNo, $city, $state){
			$this->name = $name;
			$this->fname = $fname;
			$this->contactNo = $contactNo;
			$this->city = $city;
			$this->state = $state;
		}
		
		public function display(){
			Echo "Name: " . $this->name . "\n";
			Echo "Father Name: " . $this->fname . "\n";
			Echo "Contact Number: " . $this->contactNo . "\n";
			Echo "City: " . $this->city . "\n";
			Echo "State: " . $this->state . "\n";
		}
		
		public function getData(){}
	}
	$rahul = new Employee;
	$rahul->setData('Sohan Lal', 'Mohan Lal', '9898989898', 'Falna', 'Rajasthan');
	$rahul->display();
?>  

//Output
Name: Sohan Lal
Father Name: Mohan Lal
Contact Number: 9898989898
City: Falna
State: Rajasthan

जैसाकि उपरोक्त Program के Output से हम समझ सकते हैं कि अब ये Program बिना किसी Error के Run हो जाता है, क्योंकि इस Program में हमने Base Class के getData() Method को Define कर दिया है, हालांकि इस Method में हमने एक भी Line का Code नहीं लिखा है।

जब हम किसी Abstract Class को Inherit करते हैं, तब उस Class में Declare किए गए सभी Abstract Methods के साथ जो Scope Associated होता है, कम से कम वह Scope या उससे कम Restricted Scope Specifier Inherited Class में जरूर होना चाहिए।

यानी यदि किसी Method को Protected Access Specifier के साथ Abstract Base Class में Declare किया गया हो, तो Derived Class में उस Method को Public या Protected तो रखा जा सकता है, लेकिन Private नहीं रखा जा सकता।

PHP in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook PHP in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

PHP in Hindi | Page: 647 | Format: PDF

BUY NOW GET DEMO REVIEWS