آموزش متد جادویی clone__
- توسط : علی حسین شهابی
- 0 نظر
با سلام و درود
امروز میریم سراغ متد جادویی 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 عوض می نماید.
خب سعی کردم یه مثال کامل زده باشم تو این قسمت. امیدوارم مفید بوده باشه.
برای بقیه متدهای جادویی پست های بعدی را مشاهده نمایید.