آموزش متد جادویی clone__

Image تحقیقات

آموزش متد جادویی clone__

با سلام و درود

امروز میریم سراغ متد جادویی close__ در آموزش php .

خب اول یه سری مقدمه میگیم تا برسم به متد جادویی clone__ .

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

مثال :

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 آبجکت a را در متغیر b کپی کردیم که این کپی به صورت پیشفرض copy by reference می باشد .
  • در خط 13 یک تغییر در آبجکت a دادیم تا وقتی دو آبجکت را print می نماییم متوجه شویم همانند هم می باشند.

خروجی :

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

همانطور که مشاهده کردین هر دو آبجکت همانند هم می باشند .

 

Implementation of Object Cloning in PHP

خب حالا میخواهیم نوع دیگری از کپی را بررسی نماییم . به این کپی اصطلاحا copy by value .

در این کپی وقتی ابجکت اصلی را تغییر دهیم بقیه آبجکت ها تغییر نمیکنند و مجزا می باشند .

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);
  • در این مثال در خط  12 یک کپی از آبجکت a را درون متغیر b کپی کردیم . (copy by reference)
  • در خط 13 این کپی را با استفاده از کلمه کلیدی clone در متغیر c انجام دادیم . (copy by value)

حالا هر سه آبچکت را print می نماییم تا محتوای آنها معلوم شود .

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
)

همانطور که مشاهده می نمایید متغیر a و b دقیقا شبیه هم هستن ولی متغیر c کلن جدا شده و تغییرات روی دو متغیر دیگری تاثیری روی c ندارد .

 

Object cloning with magic method __clone

در زبان php یک تابع جادویی داریم به نام clone__ که با استفاده از این تابع می توانید رفتار تابع clone که در بالا از آن استفاده کردیم عوض کنیم.

متد جادویی clone__ موقعی اجرا می شود که از یک آبجکت بخواهیم با استفاده از clone کپی بگیریم .(copy by value)

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);

خروجی :

test Object
(
    [a] => no Ankur
    [b:test:private] => techflirt
)
test Object
(
    [a] => no Ankur
    [b:test:private] => techflirt
)
test Object
(
    [a] => c
    [b:test:private] => techflirt
)
test Object
(
    [a] => no Ankur
    [b:test:private] => techflirt
)
  • همانند مثال قبل  دو نوع کپی یعنی  copy by reference و  copy by value را دادیم.فقط از متد جادویی clone__ هم استفاده کردیم که این متد موقعی که در خط 18 از clone استفاده کردیم صدا زده می شود و خروجی را برای آبجکت c عوض می نماید.

خب سعی کردم یه مثال کامل زده باشم تو این قسمت. امیدوارم مفید بوده باشه.

برای بقیه متدهای جادویی پست های بعدی را مشاهده نمایید.