PHP Autoload

PHP Autoload - Hindi

PHP Autoload – सामान्यतः जब हम किसी बडे Project पर काम कर रहे होते हैं और हमारे Project से संबंधित बहुत सारी Classes हमने Create की होती हैं, तब विभिन्न Classes को एक ही File में लिखकर Maintain करना काफी मुश्किल हो जाता है क्योंकि सामान्यतः कोई भी Class काफी बडी होती है।

इसलिए हम अपनी सुविधा की दृष्टि से विभिन्न Classes को अलग-अलग Files में Specify कर लेते हैं और जहां भी जरूरत होती है, हम हमारी Class File को require_once() Statement द्वार अपने PHP Program में Embed कर लेते हैं, परिणामस्वरूप यदि हमें किसी एक ही Class की जरूरत हो, तो हम केवल एक ही Class File को अपनी Script में Embed करते हैं, जिससे हमारे Script की Total Size काफी कम रहती है व PHP Script की Loading व Parsing Speed बढ जाती है।

लेकिन जब हमारा Project काफी बडा होता है, तब हमारी Classes भी बहुत ज्यादा होती हैं और हर Script File में सभी Required Classes को Embed करने के लिए हमें बहुत सारे require_once() Statements लिखने पडते हैं। यदि किसी कारणवश हम एक भी Class File को Current PHP Script में Embed करना भूल जाऐं, तो कई बार बहुत ही मुश्किल Bug में पड जाते हैं।

इसलिए हम एक ऐसे तरीके को उपयोग में ले सकते हैं, जिससे किसी PHP Script में उपयोग में आने वाली सभी Classes Automatically Load हो जाती हैं। PHP5 में इस नए Concept को Autoload नाम दिया गया है और इस सुविधा को __autoload() Function द्वारा प्राप्त किया जाता है। इस Function को हम निम्नानुसार अपनी Script में Specify करते हैं:

function __autoload($class) {
	require_once("classes/$class.class.php");
}

इस Function को Define करके हम require_once() Statement को बार-बार Specify करके अलग-अलग Class Files को Current Script में Embed करने से बच जाते हैं। क्योंकि जब हम हमारी Script में किसी Class को Invoke करते हैं यानी हम किसी Class का Object Create करते हैं, तो __autoload() Method Automatically Call हो जाता है और Current Script में Specify की जाने वाली Class से संबंधित File को Automatically Current Script में Embed कर देता है।

__autoload() Function को ठीक से समझने के लिए हम एक उदाहरण Program देखते हैं। हमारे इस उदाहरण Program में तीन Classes Circle, RectangleTriangle हैं और तीनों ही Classes तीन अलग Includable Files में हैं, जिनका नाम triangle.inc.php, circle.inc.phprectangle.inc.php है।

<?php
	class Circle {
		private $radius;
		
		public function input($rad){
			$this->radius = $rad;
		} 
		
		public function area(){
			return 2 * 3.1415 * $this->radius * $this->radius;
		} 
		
		function display(){
			Echo "Area of Circle : " . $this->area();
		}
	}	
?>  

<?php
	class Triangle {
		private $height, $width;
		
		public function input($height, $width){
			$this->height = $height;
			$this->width = $width;
		} 
		
		public function area(){
			return 1/2 * $this->height * $this->width;
		} 
		
		function display(){
			Echo "Area of Triangle : " . $this->area();
		}
	}
?>

<?php
	class Rectangle {
		private $height, $width;
		
		public function input($height, $width){
			$this->height = $height;
			$this->width = $width;
		} 
		
		public function area(){
			return $this->height * $this->width;
		} 
		
		function display(){
			Echo "Area of Rectangle : " . $this->area();
		}
	}
?>

<?php
	require_once('circle.inc.php');
	require_once('rectangle.inc.php');
	require_once('triangle.inc.php');
	
	$button = new Circle;
	$page = new Rectangle;
	$triangle = new Triangle;
	
	Echo "\n";
	$button->input(14);
	$button->display();

	Echo "\n";
	$page->input(10, 20);
	$page->display();
	
	Echo "\n";
	$triangle->input(5, 15);
	$triangle->display();
?>  

// Output
   Area of Circle : 1231.468
   Area of Rectangle : 200
   Area of Triangle : 37.5

इस Program में चूंकि तीन अलग Classes के Object Create किए गए हैं, इसलिए तीन अलग Classes की Files को require_once() Statement का प्रयोग करके मुख्‍य Script में तीनों Classes की Files को Embed किया गया है। अब इसी जरूरत को हम __autoload() Function को Use करके निम्नानुसार Modify कर सकते हैं:

<?php
	function __autoload($className){
		require_once($className . '.inc.php');
	}
	
	$button = new Circle;
	$page = new Rectangle;
	$triangle = new Triangle;
	
	Echo "\n";
	$button->input(14);
	$button->display();

	Echo "\n";
	$page->input(10, 20);
	$page->display();
	
	Echo "\n";
	$triangle->input(5, 15);
	$triangle->display();
?>

जब ये Script Run होता है, तब $button नाम का Object Create होते समय पहली बार Circle Class की जरूरत पडती है। चूंकि ये Class Current Script File में Available नहीं है, इसलिए PHP इन नाम की Class को खोजने के लिए __autoload() Function को Execute करता है और Class का नाम Argument के रूप में इस Function में Parameter के रूप में Pass करता है, जिसे इस Function में Specify किया गया Variable $className Accept करता है।

फिर PHP Control इस Function की Body में Enter करता है, जहां उसे require_once() नाम का Statement प्राप्त होता है। PHP इस Statement में Parameter के रूप में __autoload() Function में आने वाले Class Name को ‘.inc.php’ String के साथ Attach कर लेता है, जिससे Class File का पूरा नाम यानी Circle.inc.php बन जाता है और PHP इस File को Current Script में Embed कर लेता है। परिणामस्वरूप Circle Class Current Script में Available हो जाती है।

यही प्रक्रिया RectangleTriangle Class के लिए भी होती है और Rectangle.inc.php तथा Triangle.inc.php File भी Current Script में Embed हो जाती हैं, परिणामस्वरूप हमें हमारे इस Modified Program का Output भी वही प्राप्त होता है, जो पिछले Program का प्राप्त हुआ था।

चूंकि Linux व Unix जैसे Operating Systems में File का नाम Case Sensitive होता है, इसलिए Class के नाम व File के नाम को एक समान रखना जरूरी होता है, नहीं तो PHP “File Not Found” का Error देता है, जबकि Windows में File Name Case Sensitive नहीं होता, इसीलिए हमारे इस Program में हमें किसी तरह की Error नहीं मिल रही है।

PHP के 5.3.0 Version से पहले के Versions में __autoload() Function द्वारा जब कोई Exception Through होता है, तो PHP में उस Exception को Catch Block में Capture नहीं किया जा सकता, परिणाम स्वरूप इस Function में Generate होने वाली Exceptions एक Fatal Error के रूप में Return होती हैं।

लेकिन PHP के 5.3.0 Version व इसके बाद के सभी Versions में यदि __autoload() Function कोई Exception Trigger करता है, तो उसे catch Block में Capture करके Handle किया जा सकता है।

यदि हम किसी Class Name को call_user_func() Function में Use करते हैं, तो इसमें “../” जैसे Characters हो सकते हैं, जो कि कुछ Security Issues को Trigger करते हैं।

इसलिए यदि किसी User द्वारा Input किए जा रहे Data को इस Function में Includable File के रूप में Specify किया जा रहा हो, तो Input Data को इस Function में Specify करने से पहले Verify जरूर कर लेना चाहिए।

Difference between Abstract Class and Interface
PHP Trait - Define Trait - Traits Definition

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

PHP in Hindi | Page: 647 | Format: PDF

BUY NOW GET DEMO REVIEWS