উত্তর:
ওভারলোডিং এমন ফাংশনগুলি সংজ্ঞায়িত করছে যেগুলির অনুরূপ স্বাক্ষর রয়েছে, তবে বিভিন্ন পরামিতি রয়েছে। অগ্রাহ্য শুধুমাত্র উদ্ভূত ক্লাস, যেখানে পিতা বা মাতা বর্গ একটি পদ্ধতি সংজ্ঞায়িত হয়েছে এবং উদ্ভূত বর্গ শুভেচ্ছা করতে প্রাসঙ্গিক হয় ওভাররাইড যে পদ্ধতি।
পিএইচপি-তে, আপনি কেবল যাদু পদ্ধতি ব্যবহার করে পদ্ধতিগুলি ওভারলোড করতে পারেন __call
।
ওভাররাইডের একটি উদাহরণ :
<?php
class Foo {
function myFoo() {
return "Foo";
}
}
class Bar extends Foo {
function myFoo() {
return "Bar";
}
}
$foo = new Foo;
$bar = new Bar;
echo($foo->myFoo()); //"Foo"
echo($bar->myFoo()); //"Bar"
?>
__call
।
আপনি বিভিন্ন পরামিতিগুলির সেট ব্যবহার করে একই ফাংশনটির নাম দু'বার (বা আরও) সংজ্ঞায়িত করলে ফাংশন ওভারলোডিং ঘটে। উদাহরণ স্বরূপ:
class Addition {
function compute($first, $second) {
return $first+$second;
}
function compute($first, $second, $third) {
return $first+$second+$third;
}
}
উপরের উদাহরণে, ফাংশনটি compute
দুটি পৃথক পরামিতি স্বাক্ষরের সাথে ওভারলোড হয়েছে। * এটি এখনও পিএইচপি সমর্থন করে না। বিকল্প বিকল্প useচ্ছিক আর্গুমেন্ট ব্যবহার করা হয়:
class Addition {
function compute($first, $second, $third = 0) {
return $first+$second+$third;
}
}
ফাংশন ওভাররাইডিং তখন ঘটে যখন আপনি কোনও শ্রেণি প্রসারিত করেন এবং কোনও ফাংশন পুনর্লিখন করেন যা অভিভাবক শ্রেণিতে বিদ্যমান:
class Substraction extends Addition {
function compute($first, $second, $third = 0) {
return $first-$second-$third;
}
}
উদাহরণস্বরূপ, compute
সেট করা আচরণকে ওভাররাইড করে Addition
।
Subtraction
ক্লাসটি ক্লাসটি বাড়িয়ে দেবে Addition
। :)
কড়া কথা বলতে গেলে, কোনও পার্থক্য নেই, যেহেতু আপনিও করতে পারবেন না :)
এপিডির মতো পিএইচপি এক্সটেনশান দিয়ে ফাংশন ওভাররাইড করা যেতে পারে তবে এটি অবহেলা করা হয়েছে এবং আফিকের শেষ সংস্করণটি ব্যবহারযোগ্য নয়।
ডায়নামিক টাইপিংয়ের কারণে পিএইচপি-তে ফাংশন ওভারলোডিং করা যায় না, অর্থাৎ পিএইচপি-তে আপনি কোনও নির্দিষ্ট ধরণের ভেরিয়েবলকে "সংজ্ঞায়িত" করেন না। উদাহরণ:
$a=1;
$a='1';
$a=true;
$a=doSomething();
প্রতিটি ভেরিয়েবল বিভিন্ন ধরণের, তবুও আপনি মৃত্যুদন্ড কার্যকর করার আগে টাইপটি জানতে পারবেন (চতুর্থটি দেখুন)। তুলনা হিসাবে, অন্যান্য ভাষা ব্যবহার করে:
int a=1;
String s="1";
bool a=true;
something a=doSomething();
শেষ উদাহরণে, আপনাকে অবশ্যই ভেরিয়েবলের ধরণের চাপ প্রয়োগ করতে হবে (উদাহরণস্বরূপ, আমি ডেটা টাইপ "কিছু" ব্যবহার করেছি)।
পিএইচপি-তে ফাংশন ওভারলোডিং কেন সম্ভব নয় এমন আরেকটি "ইস্যু": পিএইচপি-র ফানক_জেট_আর্গস () নামে একটি ফাংশন রয়েছে, যা বর্তমান আর্গুমেন্টগুলির একটি অ্যারে ফিরিয়ে দেয়, এখন নিম্নলিখিত কোডটি বিবেচনা করুন:
function hello($a){
print_r(func_get_args());
}
function hello($a,$a){
print_r(func_get_args());
}
hello('a');
hello('a','b');
উভয় ফাংশন বিবেচনা করে কোনও পরিমাণ আর্গুমেন্ট গ্রহণ করে, কোনটি সংকলকটি বেছে নেওয়া উচিত?
পরিশেষে, আমি উপরের উত্তরগুলি আংশিক ভুল কেন তা উল্লেখ করতে চাই; ফাংশন ওভারলোডিং / ওভাররাইডিং পদ্ধতি ওভারলোডিং / ওভাররাইডিং এর সমান নয় ।
যেখানে কোনও পদ্ধতি কোনও ফাংশনের মতো তবে শ্রেণীর জন্য নির্দিষ্ট, সেই ক্ষেত্রে, পিএইচপি ক্লাসগুলিতে ওভাররাইড করার অনুমতি দেয় তবে ভাষা শব্দার্থের কারণে আবার কোনও ওভারলোডিং হয় না।
উপসংহারে, জাভাস্ক্রিপ্টের মতো ভাষাগুলি ওভাররাইডের অনুমতি দেয় (তবে আবার কোনও ওভারলোডিং নেই) তবে তারা ব্যবহারকারীর কার্যকারিতা এবং কোনও পদ্ধতির ওভাররাইডের মধ্যে পার্থক্যও দেখাতে পারে:
/// Function Overriding ///
function a(){
alert('a');
}
a=function(){
alert('b');
}
a(); // shows popup with 'b'
/// Method Overriding ///
var a={
"a":function(){
alert('a');
}
}
a.a=function(){
alert('b');
}
a.a(); // shows popup with 'b'
ওভারলোডিং উদাহরণ
class overload {
public $name;
public function __construct($agr) {
$this->name = $agr;
}
public function __call($methodname, $agrument) {
if($methodname == 'sum2') {
if(count($agrument) == 2) {
$this->sum($agrument[0], $agrument[1]);
}
if(count($agrument) == 3) {
echo $this->sum1($agrument[0], $agrument[1], $agrument[2]);
}
}
}
public function sum($a, $b) {
return $a + $b;
}
public function sum1($a,$b,$c) {
return $a + $b + $c;
}
}
$object = new overload('Sum');
echo $object->sum2(1,2,3);
যদিও ওভারলোডিং দৃষ্টান্তটি পিএইচপি দ্বারা সম্পূর্ণরূপে সমর্থিত নয় ডিফল্ট প্যারামিটার (গুলি) (যেমন আগে কেউ উল্লেখ করেছেন) দিয়ে একই (বা খুব অনুরূপ) প্রভাব অর্জন করা যেতে পারে।
আপনি যদি নিজের ফাংশনটিকে এভাবে নির্দিষ্ট করে থাকেন:
function f($p=0)
{
if($p)
{
//implement functionality #1 here
}
else
{
//implement functionality #2 here
}
}
আপনি যখন এই ফাংশনটি কল করবেন:
f();
আপনি একটি কার্যকারিতা পাবেন (# 1), তবে আপনি যদি এইটিকে প্যারামিটার দিয়ে কল করেন:
f(1);
আপনি অন্য কার্যকারিতা পাবেন (# 2)। এটি ওভারলোডিংয়ের প্রভাব - ফাংশনের ইনপুট প্যারামিটার (গুলি) এর উপর নির্ভর করে বিভিন্ন কার্যকারিতা।
আমি জানি, কেউ এখন জিজ্ঞাসা করবে যে সে / সে এই ফাংশনটিকে এফ (0) হিসাবে ডাকে তবে তার কার্যকারিতা কী হবে।
আমি এখানে উল্লেখ করতে চাই যে পিএইচপি-তে ওভারলোডিংয়ের অন্যান্য প্রোগ্রামিং ভাষার তুলনায় সম্পূর্ণ ভিন্ন অর্থ রয়েছে। প্রচুর লোক বলেছে যে পিএইচপি এবং ওভারলোডিংয়ের প্রচলিত সংজ্ঞা দ্বারা ওভারলোডিং সমর্থিত নয়, হ্যাঁ কার্যকারিতা সুস্পষ্টভাবে উপলভ্য নয়।
তবে পিএইচপি-তে ওভারলোডিংয়ের সঠিক সংজ্ঞা সম্পূর্ণ আলাদা।
পিএইচপি-তে ওভারলোডিং বলতে __set () এবং __get () এর মতো যাদু পদ্ধতি ব্যবহার করে গতিশীলভাবে বৈশিষ্ট্য এবং পদ্ধতি তৈরি বোঝায়। অ্যাক্সেসযোগ্য বা ঘোষিত নয় এমন পদ্ধতি বা বৈশিষ্ট্যগুলির সাথে ইন্টারঅ্যাক্ট করার সময় এই ওভারলোডিং পদ্ধতিগুলি ডাকা হয়।
এখানে পিএইচপি ম্যানুয়াল থেকে একটি লিঙ্ক দেওয়া হয়েছে: http://www.php.net/manual/en/language.oop5.overloading.php
দুই বা ততোধিক পদ্ধতি একই পদ্ধতির নাম সহ তবে একক শ্রেণিতে বিভিন্ন সংখ্যক পরামিতি যুক্ত হলে পদ্ধতি ওভারলোডিং হয়। পিএইচপি পদ্ধতি ওভারলোডিং সমর্থন করে না। মেথড ওভাররাইডিং অর্থ দুটি ভিন্ন ক্লাসে একই পদ্ধতির নাম এবং একই সংখ্যার পরামিতি সহ দুটি পদ্ধতি মানে পিতামাত্ত শ্রেণি এবং শিশু শ্রেণি।
ফাংশন ওভারলোডিং এবং ওভাররাইডের মধ্যে কিছু পার্থক্য রয়েছে যদিও উভয় ক্ষেত্রে একই ফাংশনের নাম রয়েছে over একই নামের মধ্যে ওভারলোডিংয়ের মধ্যে বিভিন্ন ধরণের আর্গুমেন্ট বা রিটার্ন টাইপ থাকে; যেমন: "ফাংশন অ্যাড (ইন্ট এ, ইনট বি)" এবং " ফাংশন অ্যাড (ফ্লোট এ, ফ্লোট বি); এখানে অ্যাড () ফাংশনটি ওভারলোড হয়েছে over যুক্তি এবং ফাংশন নাম উভয়ই একই ক্ষেত্রে দেখা যায় generally এটি সাধারণত উত্তরাধিকারে বা বৈশিষ্ট্যে পাওয়া যায় W আমাদের প্রবর্তনের জন্য কিছু কৌশল অনুসরণ করতে হবে , কী ফাংশনটি এখন কার্যকর করবে। সুতরাং প্রোগ্রামার ওভাররাইডে কাঙ্ক্ষিত ফাংশনটি সম্পাদন করার জন্য কিছু কৌশল অনুসরণ করে যেখানে ওভারলোডিংয়ের মধ্যে প্রোগ্রামটি স্বয়ংক্রিয়ভাবে পছন্দসই ফাংশনটি সনাক্ত করতে পারে ... ধন্যবাদ!
ওভারলোডিং : রিয়েল ওয়ার্ল্ডে ওভারলোডিং অর্থ কাউকে কিছু অতিরিক্ত জিনিস বরাদ্দ করা। বাস্তব পৃথিবীর মতো পিএইচপি-তে ওভারলোডিং মানে অতিরিক্ত ফাংশনগুলিকে কল করা। অন্য উপায়ে আপনি বলতে পারেন যে এটির বিভিন্ন পরামিতিগুলির সাথে স্লিমিয়ার ফাংশন রয়েছে PH পিএইচপি-তে আপনি যাদু ফাংশনগুলির সাথে ওভারলোডিং ব্যবহার করতে পারেন যেমন __get, __set, __call ইত্যাদি can
ওভারলোডিং এর উদাহরণ:
class Shape {
const Pi = 3.142 ; // constant value
function __call($functionname, $argument){
if($functionname == 'area')
switch(count($argument)){
case 0 : return 0 ;
case 1 : return self::Pi * $argument[0] ; // 3.14 * 5
case 2 : return $argument[0] * $argument[1]; // 5 * 10
}
}
}
$circle = new Shape();`enter code here`
echo "Area of circle:".$circle->area()."</br>"; // display the area of circle Output 0
echo "Area of circle:".$circle->area(5)."</br>"; // display the area of circle
$rect = new Shape();
echo "Area of rectangle:".$rect->area(5,10); // display area of rectangle
ওভাররাইডিং : অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ওভাররাইডিংয়ে শিশু শ্রেণিতে পিতামাতার পদ্ধতি প্রতিস্থাপন করা হয় over ওভাররাইডিংয়ের সময় আপনি শিশু শ্রেণিতে পিতামাতার শ্রেণির পদ্ধতিটি পুনরায় ঘোষণা করতে পারেন। সুতরাং, মূলত ওভাররাইডের উদ্দেশ্য হ'ল আপনার পিতামাতার বর্গ পদ্ধতির আচরণ পরিবর্তন করা।
ওভাররাইডের উদাহরণ:
class parent_class
{
public function text() //text() is a parent class method
{
echo "Hello!! everyone I am parent class text method"."</br>";
}
public function test()
{
echo "Hello!! I am second method of parent class"."</br>";
}
}
class child extends parent_class
{
public function text() // Text() parent class method which is override by child
class
{
echo "Hello!! Everyone i am child class";
}
}
$obj= new parent_class();
$obj->text(); // display the parent class method echo
$obj= new parent_class();
$obj->test();
$obj= new child();
$obj->text(); // display the child class method echo
পিএইচপি 5.XX ওভারলোডিং সমর্থন করে না এই কারণেই পিএইচপি পুরোপুরি OOP নয়।