PHP Object Oriented Programming
PHP Object Oriented Programming পর্ব-১০: PHP OOP Overloading
PHP OOP Overloading কি?
class এর বাহির থেকে class ব্যবহারকারীর চাহিদা অনুযায়ী স্বয়ংক্রিয়ভাবে class এর মধ্যে (যা পূর্ব থেকে define করা নাই এমন) যেকোনো property অথবা Method তৈরী করার পদ্ধতিকে PHP Object Oriented Programming এর পরিভাষায় Overloading বলা হয়। PHP OOP Overloading কে আমরা class ব্যবহারকারীর চাহিদা অনুযায়ী স্বয়ংক্রিয়ভাবে property এবং Method তৈরী করার পদ্ধতিও বলতে পারি।
PHP OOP Overloading কত প্রকার ?
PHP OOP Overloading মূলত দুইপ্রকার:
১. Property Overloading
২. Method Overloading
Property Overloading কি?
class এর বাহির থেকে class ব্যবহারকারীর চাহিদা অনুযায়ী স্বয়ংক্রিয়ভাবে class এর মধ্যে (যা পূর্ব থেকে define করা নাই এমন) যেকোনো property তৈরী করার পদ্ধতিকে PHP Object Oriented Programming এর পরিভাষায় Property Over Loading বলা হয়। Property Overloading কে আমরা class ব্যবহারকারীর চাহিদা অনুযায়ী স্বয়ংক্রিয়ভাবে property তৈরী করার পদ্ধতিও বলতে পারি।
PHP তে Property Overloading এ আমরা __set() function দিয়ে Overloaded property তে value সেট করি, __get() function দিয়ে Overloaded property এর value get করি, __unset() function দিয়ে Overloaded property এর value, class এর বাহির থেকে খালি করি এবং __isset() function দিয়ে Overloaded property এর value আছে কি না তা class এর বাহির থেকে চেক করি
PHP তে Property Overload করার জন্য __set() এবং __get ফাঙ্কশনের কাজ কি?
PHP তে Property Overload করার জন্য __set() function দিয়ে class এর বাহির থেকে নতুন property তৈরী করা যায়। এবং তৈরিকৃত property তে value set করা যায়। __get() function দিয়ে Overloaded property এর value কে class এর বাহির থেকে get করা যায়।
<?php class PropertyTest { /** Location for overloaded data. */ private $data = array(); public function __set($name, $value) { echo "Setting '$name' Property to '$value'\n"; $this->data[$name] = $value; } public function __get($name) { echo "Getting '$name' Property with Value : "; if (array_key_exists($name, $this->data)) { return $this->data[$name]; } } } $obj = new PropertyTest; $obj->a = "Masud Alam"; echo $obj->a . "\n"; ?>
ব্যাখ্যা: প্রথমে আমরা __set() function দিয়ে class টির মধ্যে $a নামে একটি property তৈরী করি (যা আমাদের class এ define করা ছিলোনা ) একই সাথে $a তে value সেট করি। এবং একই সাথে $data নামে একটা private array property তে property name এবং তার value টি সংরক্ষণ করে রাখি। তারপর __get() function দিয়ে class টির মধ্যে $data array property থেকে $a নামে property এর value গেট করি।
PHP তে Property Overload করার জন্য __isset() ফাঙ্কশনের কাজ কি?
class এর বাহির থেকে যখন কোনো overloaded property কে isset() function দিয়ে চেক করা হয়, তখন class এর মধ্যে __isset() function টি স্বয়ংক্রিয় ভাবে execute হয়। এবং overloaded property এর value আছে কি না তা চেক করার সুযোগ করে দেয়।
<?php class PropertyTest { /** Location for overloaded data. */ private $data = array(); public function __set($name, $value) { echo "Setting '$name' Property to '$value'\n"; $this->data[$name] = $value; } public function __get($name) { echo "Getting '$name' Property with Value : "; if (array_key_exists($name, $this->data)) { return $this->data[$name]; } } // Checking Property Value is set? public function __isset($name) { echo "Is '$name' Property set?\n"; echo isset($this->data[$name])?"Yes '$name' Property is set":"No '$name' Property is Not set"; echo "\n"; } } $obj = new PropertyTest; $obj->a = "Masud Alam"; echo $obj->a . "\n"; isset($obj->a); isset($obj->b); ?>
ব্যাখ্যা: লক্ষ্য করুন , লাইন নম্বর ৩৫ এবং ৩৬ এ ফাঙ্কশন isset() দিয়ে দুটি unknown property কে class এর মধ্যে value সেট আছে কিনা চেক করি, আর isset () function call করার সাথে সাথে আমাদের class এর মধ্যে ২১ নম্বর লাইনে __isset() ফাঙ্কশনটি স্বয়ংক্রিয় ভাবে execute হয়। overloaded property গুলোর value আছে কিনা তা চেক করে।
PHP তে Property Overload করার জন্য __unset() ফাঙ্কশনের কাজ কি?
class এর বাহির থেকে যখন কোনো overloaded property কে unset() function দিয়ে চেক করা হয়, তখন class এর মধ্যে __unset() function টি স্বয়ংক্রিয় ভাবে execute হয়। এবং overloaded property এর value কে unset করার সুযোগ করে দেয়।
<?php class PropertyTest { /** Location for overloaded data. */ private $data = array(); public function __set($name, $value) { echo "Setting '$name' to '$value'\n"; $this->data[$name] = $value; } public function __get($name) { echo "Getting '$name' Property with Value : "; if (array_key_exists($name, $this->data)) { return $this->data[$name]; } } public function __isset($name) { echo "Is '$name' Property set?\n"; echo isset($this->data[$name])?"Yes '$name' Property is set":"No '$name' Property is Not set"; echo "\n"; } public function __unset($name) { echo "Unsetting '$name'\n"; unset($this->data[$name]); } } $obj = new PropertyTest; $obj->a = "Masud Alam"; echo $obj->a . "\n"; echo isset($obj->a); unset($obj->a); echo isset($obj->a); echo "\n"; ?>
ব্যাখ্যা: লক্ষ্য করুন , লাইন নম্বর ৪২ এ ফাঙ্কশন unset() দিয়ে unknown property এর value unset করার জন্য call করি, আর unset () function call করার সাথে সাথে আমাদের class এর মধ্যে ২8 নম্বর লাইনে __unset() ফাঙ্কশনটি স্বয়ংক্রিয় ভাবে execute হয়। overloaded property গুলোর value unset করে।
Method Overloading কি?
class এর বাহির থেকে class ব্যবহারকারীর চাহিদা অনুযায়ী স্বয়ংক্রিয়ভাবে class এর মধ্যে (যা পূর্ব থেকে define করা নাই এমন) যেকোনো Method তৈরী করার পদ্ধতিকে PHP Object Oriented Programming এর পরিভাষায় Method Over Loading বলা হয়। Method Overloading কে আমরা class ব্যবহারকারীর চাহিদা অনুযায়ী স্বয়ংক্রিয়ভাবে Method তৈরী করার পদ্ধতিও বলতে পারি।
PHP তে Method Overloading এ আমরা __call() function দিয়ে class এর বাহিরের থেকে Overloaded Method তৈরী করি এবং Overloaded Method এ Parameter set করি। এবং __callStatic() function দিয়ে class এর বাহিরের থেকে Overloaded static Method তৈরী করি এবং Overloaded static Method এ Parameter set করি
<?php class MethodTest { public function __call($name, $arguments) { echo "Calling object method '$name' " . implode(', ', $arguments). "\n"; } public static function __callStatic($name, $arguments) { echo "Calling static method '$name' " . implode(', ', $arguments). "\n"; } } $obj = new MethodTest; $obj->runTest('in object context'); MethodTest::runTest('in static context'); ?>
নিচে Method Overloading feature ব্যবহার করে একটা CRUD উদহারণ দেওয়া হলো
<?php class Db{ private $conn; public function __construct($host,$user,$pass,$db){ $this->conn=new mysqli($host,$user,$pass,$db); if($this->conn->connect_errno){ die("Connection Fail for: ".$this->conn->connect_error); } } public function __call($method,$params){ //echo $params[1]; extract($params[0]); switch($action){ case "read": if(isset($where)){ $sql="SELECT $cols FROM $table WHERE $where"; $result=$this->conn->query($sql); if($result->num_rows>0){ return $result->fetch_assoc(); } } else{ $sql="SELECT $cols FROM $table"; $result=$this->conn->query($sql); if($result->num_rows>0){ return $result->fetch_all(MYSQLI_ASSOC); } } break; case "insert": $sql="INSERT INTO $table SET $cols"; $result=$this->conn->query($sql); if($this->conn->affected_rows>0){ return true; } break; case "update": $sql="UPDATE $table SET $cols WHERE $where"; $result=$this->conn->query($sql); if($this->conn->affected_rows>0){ return true; } break; case "delete": $sql="DELETE FROM $table WHERE $where"; $result=$this->conn->query($sql); if($this->conn->affected_rows>0){ return true; } break; default: return false; break; } } } $connect=new Db("localhost","root","","php85"); echo "<pre>"; print_r($connect->read(array("table"=>"students","cols"=>"*","action"=>"read"))); //print_r($connect->readAll(array("table"=>"students","cols"=>"*"))); /*print_r($connect->getById(array("table"=>"students","cols"=>"name,mobile","where"=>"id=19","action"=>"read")));*/ //echo $connect->Add(array("table"=>"students","cols"=>"name='Iftekhar',mobile='0122113323',address='Laxmipur,Bangladesh'","action"=>"insert"))?"Insert Success":"Insert Fail"; //echo $connect->removeData(array("table"=>"students","action"=>"delete","where"=>"id=19"))?"Delete Success":"Delete Fail"; echo "</pre>";