কম্পিউটার টিউটোরিয়াল

PHP অবজেক্ট ক্লোনিং


ভূমিকা

সাদা অ্যাসাইনমেন্ট দ্বারা একটি অবজেক্টের কপি তৈরি করলে কেবল মেমোরিতে থাকা অবজেক্টের অন্য একটি রেফারেন্স তৈরি হয়। তাই, অ্যাট্রিবিউটে পরিবর্তন হলেও মূল এবং ডুপ্লিকেট উভয় অবজেক্টে প্রতিফলিত হয়। PHP-তে clone কিওয়ার্ড আছে যা অবজেক্টের একটি শ্যালো কপি তৈরি করে। তবে, যদি মূল অবজেক্টের প্রপার্টি হিসেবে অন্য কোনো এমবেডেড অবজেক্ট থাকে, তাহলে কপি করা অবজেক্টও এখনো একই إمবেডেড অবজেক্টকে রেফার করে। অবজেক্টের একটি ডিপ কপি তৈরি করতে, ম্যাজিক মেথড __clone() ক্লাসে ডিফাইন করতে হয়।

অ্যাসাইনমেন্ট দ্বারা কপি

নিচের কোডে, myclass-এ একটি অ্যাট্রিবিউট আছে address ক্লাসের অবজেক্ট হিসেবে। myclass-এর একটি অবজেক্ট অ্যাসাইনমেন্ট দ্বারা ডুপ্লিকেট করা হয়েছে। এর প্রপার্টির মান পরিবর্তন করলে উভয় অবজেক্টে পরিবর্তন দেখা যায়:

উদাহরণ

<?php
class address{
    var $city="Nanded";
    var $pin="431601";
    function setaddr($arg1, $arg2){
        $this->city=$arg1;
        $this->pin=$arg2;
    }
}
class myclass{
    var $name="Raja";
    var $obj;
    function setname($arg){
        $this->name=$arg;
    }
}
$obj1=new myclass();
$obj1->obj=new address();
echo "original object\n";
print_r($obj1);
$obj2=$obj1;
$obj1->setname("Ravi");
echo "after change:\n";
print_r($obj1);
print_r($obj2);
?>

আউটপুট

এই কোড নিচের আউটপুট দেখায়:

original object
myclass Object(
    [name] => Raja
    [obj] => address Object(
        [city] => Nanded
        [pin] => 431601
    )
)
after change:
original object
myclass Object(
    [name] => Ravi
    [obj] => address Object(
        [city] => Nanded
        [pin] => 431601
    )
)
copied object
myclass Object(
    [name] => Ravi
    [obj] => address Object(
        [city] => Nanded
        [pin] => 431601
    )
)

clone কিওয়ার্ড ব্যবহার

clone কিওয়ার্ড একটি শ্যালো কপি তৈরি করে। প্রপার্টির মান পরিবর্তন করলে ক্লোন করা অবজেক্টে প্রতিফলিত হয় না। তবে, এমবেডেড অবজেক্ট পরিবর্তন করলে মূল এবং ক্লোন করা উভয় অবজেক্টে পরিবর্তন দেখা যায়।

উদাহরণ

<?php
class address{
    var $city="Nanded";
    var $pin="431601";
    function setaddr($arg1, $arg2){
        $this->city=$arg1;
        $this->pin=$arg2;
    }
}
class myclass{
    var $name="Raja";
    var $obj;
    function setname($arg){
        $this->name=$arg;
    }
}
$obj1=new myclass();
$obj1->obj=new address();
echo "original object:\n";
print_r($obj1);
$obj2=clone $obj1;
$obj1->setname("Ravi");
$obj1->obj->setaddr("Mumbai", "400001");
echo "after change:\n";
echo "original object:\n";
print_r($obj1);
echo "cloned object:\n";
print_r($obj2);
?>

আউটপুট

আউটপুট নিচের ফলাফল দেখায়:

original object:
myclass Object(
    [name] => Raja
    [obj] => address Object(
        [city] => Nanded
        [pin] => 431601
    )
)
after change:
original object:
myclass Object(
    [name] => Ravi
    [obj] => address Object(
        [city] => Mumbai
        [pin] => 400001
    )
)
cloned object:
myclass Object(
    [name] => Raja
    [obj] => address Object(
        [city] => Mumbai
        [pin] => 400001
    )
)

__clone() মেথড ব্যবহার

__clone() মেথড এমবেডেড অবজেক্টও ক্লোন করে একটি ডিপ কপি তৈরি করে:

উদাহরণ

<?php
class address{
    var $city="Nanded";
    var $pin="431601";
    function setaddr($arg1, $arg2){
        $this->city=$arg1;
        $this->pin=$arg2;
    }
}
class myclass{
    var $name="Raja";
    var $obj;
    function setname($arg){
        $this->name=$arg;
    }
    public function __clone() {
        $this->obj = clone $this->obj ;
    }
}
$obj1=new myclass();
$obj1->obj=new address();
echo "original object:\n";
print_r($obj1);
$obj2=clone $obj1;
$obj1->setname("Ravi");
$obj1->obj->setaddr("Mumbai", "400001");
echo "after change:\n";
echo "original object:\n";
print_r($obj1);
echo "cloned object:\n";
print_r($obj2);
?>

আউটপুট

আউটপুট নিচের ফলাফল দেখায়:

original object:
myclass Object(
    [name] => Raja
    [obj] => address Object(
        [city] => Nanded
        [pin] => 431601
    )
)
after change:
original object:
myclass Object(
    [name] => Ravi
    [obj] => address Object(
        [city] => Mumbai
        [pin] => 400001
    )
)
cloned object:
myclass Object(
    [name] => Raja
    [obj] => address Object(
        [city] => Nanded
        [pin] => 431601
    )
)

  1. PHP-এ method_exists() ফাংশন

  2. PHP-এ is_a() ফাংশন

  3. PHP-এ get_class() ফাংশন

  4. PHP-এ get_object_vars() ফাংশন