__clone زمانی فراخوانی میشود که یک شیء کلون شود. استفاده از کلون به شما اجازه میدهد یک نسخه دقیق از یک شیء موجود را ایجاد کنید، اما با این توانایی که رفتار پیشفرض کلون را اصلاح کنید. این بدان معناست که میتوانید تنظیمات ویژهای را برای نحوه کپی شدن خصوصیات شیء اعمال کنید، بخصوص زمانی که با خصوصیاتی که به شیءهای دیگر اشاره دارند سروکار دارید.مثال:
فرض کنید که شما یک کلاس برای مدیریت پروفایل کاربر دارید و میخواهید که هر کلون از این کلاس دارای تنظیمات پیشفرض مشابهی باشد اما بتوان آن را به صورت جداگانه تنظیم کرد:
class UserProfile {
public $name;
public $email;
private $settings;
public function __construct($name, $email)
{
$this->name = $name;
$this->email = $email;
$this->settings = new stdClass();
$this->settings->theme = "default";
}
public function __clone()
{
$this->settings = clone $this->settings;
}
}
$user1 = new UserProfile("Ali", "ali@example.com");
$user2 = clone $user1;
$user2->name = "Reza";
$user2->settings->theme = "dark";
echo $user1->name . " has theme " . $user1->settings->theme . "\n";
// Ali has theme default
echo $user2->name . " has theme " . $user2->settings->theme . "\n";
// Reza has theme darkدر مثال ارائه شده، یک کلاس به نام UserProfile تعریف شده که حاوی اطلاعات کاربر است. وقتی شیء این کلاس کلون میشود، مجیک متد
__clone فعال شده و به جای اینکه تنها به شیء settings ارجاع دهد، یک نسخه کاملاً جدید از آن را ایجاد میکند. این کار موجب میشود که هر کاربر کلون شده دارای تنظیمات مستقل خود باشد و تغییرات اعمال شده بر روی یک شیء، بر شیء دیگر تأثیر نگذارد. این امکان از طریق کپی عمیق انجام میشود که به معنای کپی کردن همه خصوصیات، و نه فقط ارجاعها، به نسخه کلون شده است.
کپی عمیق و کپی سطحی:
در PHP، کلونینگ میتواند به دو نوع تقسیم شود: کپی سطحی و کپی عمیق.
کپی سطحی (Shallow Copy):
در این نوع کپی، فقط خصوصیات سطحی شیء کپی میشوند و هر خصوصیتی که به شیء دیگری ارجاع دهد، فقط ارجاع کپی میشود. این بدین معنی است که شیهای اصلی و کلون شده به همان شیء ارجاعی اشاره خواهند کرد.
کپی عمیق (Deep Copy):
کپی عمیق شامل کپی کردن شیء و همچنین هر شیء دیگری است که توسط خصوصیات اصلی به آن اشاره شده است. این اطمینان حاصل میکند که شیء کلون شده و شیء اصلی هیچ ارتباط مستقیمی با یکدیگر ندارند. استفاده از مجیک متد
__clone در PHP این امکان را میدهد که شما بتوانید کپی عمیق را اجرا کنید و خصوصیاتی که به شیءهای دیگر اشاره دارند را نیز به صورت مجزا کپی کنید.👤 AmirHossein
💎 Channel: @DevelopixPHP