آموزش Object Cloning در php

Image تحقیقات

آموزش Object Cloning در php

سلام خدمت همه دوست داران php

در زبان php اگر یک آبجکت را به صورت مستقیم داخل یک متغیر کپی کنیم. این کپی by reference حساب میشه نه by value . (فارسی بدردبخوری براش پیدا نکردم)… منظور از by reference یعنی شما هر بلایی سر متغیر اولی بیاری ، روی متغیر دوم هم اعمال میشه ولی در by value اینطور نیست و دو متغیر کاملا جدا هستن .

حالا با مثال این قضیه رو روشن تر میکنم.

Object copy or by reference copy

class test
{
public $a;
private $b;
function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
}
$a = new test("ankur" , "techflirt");
$b = $a; //Copy of the object
$a->a = "no Ankur";
print_r($a);
print_r($b);

حالا مثال بالا رو بررسی کنیم :

 

  • در خط 11 یک آبجکت ساختیم از کلاس test
  • در خط 12 آبجکت رو داخل یک متغیر به نام b ریختیم (این نوع کپی کردن آبجکت by reference است) .
  • در خط 13 پروپرتی a را تغییر دادیم در نتیجه در دوتا آبجکت هامون این تغییر انجام می شود زیرا از کپی از نوع by reference بوده.

خروجی کد بالا :

test Object
(
    [a] => no Ankur
    [b:test:private] => techflirt
)
test Object
(
    [a] => no Ankur
    [b:test:private] => techflirt
)

Implementation of Object Cloning in PHP

تو مثال قبلی حالت عادی رو بررسی کردیم که by reference بود حالا میریم سراغ اصل مطلب که کپی دو تا آبجکت به صورت by value است که این عمل با استفاده از کلمه کلیدی clone انجام می شود .

مثال :

class test
{
public $a;
private $b;
function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
}
$a = new test("ankur" , "techflirt");
$b = $a; //Copy of the object
$c = clone $a; //clone of the object
$a->a = "no Ankur";
print_r($a);
print_r($b);
print_r($c);
  •  در خط 13  آبجکت a را به صورت by value داخل متغیر c ریختیم پس تغییراتی که در آبجت a بعد از این کپی ، دیگر تاثیری روی متغیر c ندارد و فقط روی متغیر b تاثیر گذار است.

خروجی :

test Object
(
    [a] => no Ankur
    [b:test:private] => techflirt
)
test Object
(
    [a] => no Ankur
    [b:test:private] => techflirt
)
test Object
(
    [a] => ankur
    [b:test:private] => techflirt
)
test Object
(
    [a] => no Ankur
    [b:test:private] => techflirt
)

 Object cloning with magic method __clone

در آخر میریم سراغ یک magic method به نام clone__ . این متد زمانی اجرا می شود که یه آبجکت به وسیلیه clone داخل متغیر دیگری کپی شود.

class test
{
public $a;
private $b;
function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
function __clone()
{
$this->a = "c";
}
}
$a = new test("ankur" , "techflirt");
$b = $a; //Copy of the object
$c = clone $a; //clone of the object
$a->a = "no Ankur";
print_r($a);
print_r($b);
print_r($c);
print_r($a);
  •  در خط 13 متد clone__ را ساختیم پس هر موقع عمل کپی توسط clone انجام شود این متد به صورت اتوماتیک اجرا شده پس در نتیجه مقدار متغیر C همان c می باشد.

خروجی کد بالا :

test Object
(
    [a] => no Ankur
    [b:test:private] => techflirt
)
test Object
(
    [a] => no Ankur
    [b:test:private] => techflirt
)
test Object
(
    [a] => ankur
    [b:test:private] => techflirt
)
test Object
(
    [a] => no Ankur
    [b:test:private] => techflirt
)

خب اینم از معرفی Object Cloning در زبان php .

از لینک های زیر هم می توانید برای مطالعه بیشتر استفاده نمایید :

http://php.net/manual/en/language.oop5.cloning.php http://en.wikipedia.org/wiki/Object_copy