__get و __set برای دسترسی به پراپرتی که به طور مستقیم قابل دسترسی نیستند یا وجود خارجی ندارند، استفاده میشوند. این مجیک متدها اجازه میدهند تا شما در هنگام دسترسی یا تنظیم مقادیر پراپرتی کلاس، کنترل بیشتری داشته باشید. به عبارت دیگر، وقتی خواسته میشود که به یک پراپرتی دسترسی پیدا شود که تعریف نشده است یا دسترسی مستقیم به آن امکانپذیر نیست، این متدها فعال میشوند.مجیک متد
__get:این مجیک متد زمانی فراخوانی میشود که سعی میکنید به یک پراپرتی که وجود ندارد یا خصوصی است، دسترسی پیدا کنید.
مثال:
class User {
private $data = [
"name" => "John Doe",
"email" => "john@example.com"
];
public function __get($name) {
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
} else {
return null;
}
}
}
$user = new User();
echo $user->name; // Outputs: John Doe
echo $user->email; // Outputs: john@example.com
echo $user->age; // Outputs: nullدر این مثال، هرگاه که میخواهیم به name یا email دسترسی پیدا کنیم، مجیک متد
__get فراخوانی شده و مقدار مربوطه برگردانده میشود. اگر پراپرتی وجود نداشته باشد، null برگردانده میشود.مجیک متد
__set:این مجیک متد زمانی فراخوانی میشود که سعی میکنید مقدار یک پراپرتی که وجود ندارد یا خصوصی است را تنظیم کنید.
مثال:
class User {
private $data = [
"name" => "John Doe",
"email" => "john@example.com"
];
public function __set($name, $value) {
if (array_key_exists($name, $this->data)) {
$this->data[$name] = $value;
}
}
}
$user = new User();
$user->name = "Jane Doe"; // changes the name property
echo $user->name; // Outputs: Jane Doeدر این مثال، مقدار name از طریق مجیک متد
__set تغییر میکند. اگر پراپرتی وجود نداشته باشد، امکان افزودن یا تغییر آن وجود ندارد و میتوانید خطایی را لاگ یا اکسپشن بیندازید.مثال تکمیلی:
class Product {
private $data = [];
public function __set($key, $value) {
switch ($key) {
case "price":
if (!is_numeric($value) || $value < 0) {
throw new Exception("Invalid price");
}
break;
case "name":
$value = trim(strip_tags($value));
break;
}
$this->data[$key] = $value;
}
public function __get($key) {
return $this->data[$key] ?? null;
}
}
$product = new Product();
$product->name = "New <b>Product</b>"; // HTML tags will be removed
$product->price = 20;
echo $product->name; // Outputs: New Product
echo $product->price; // Outputs: 20در این مثال، مجیک متد
__set به گونهای تعریف شده است که قبل از ذخیرهسازی، مقدار قیمت را بررسی میکند تا از صحت آن اطمینان حاصل کند و از ذخیرهسازی مقادیر نامعتبر جلوگیری کند. همچنین، نام محصول از تگهای HTML پاک میشود.سپس توسط مجیک متد
__get نام و قیمت دریافت می شود.همه این ها در حالی است که پراپرتی های name و price در کلاس ما وجود ندارند.
مجیک متدهای
__get و __set در PHP ابزارهای قدرتمندی هستند که به شما امکان میدهند کنترل بیشتری بر نحوه دسترسی و تغییر دادهها در کلاسهایتان داشته باشید.👤 AmirHossein
💎 Channel: @DevelopixPHP