این ویژگی در PHP 8.4 معرفی شده است که کنترل بیشتری روی نحوه خواندن و نوشتن ویژگیهای کلاس فراهم میکند. این قابلیت، انعطافپذیری بالایی در مدیریت رفتار ویژگیهای کلاس به توسعهدهندگان میدهد.
- تعریف کلی
پراپرتی هوک ها به شما اجازه میدهند تا به صورت مستقیم رفتار خواندن و نوشتن یک ویژگی را با استفاده از متدهای خاص تنظیم کنید.
این ویژگی به شما امکان میدهد که بدون نیاز به استفاده از مجیک متدهای (مانند __get و __set) رفتار سفارشی برای ویژگیهای خاصی تعریف کنید.
- ساختار استفاده
پراپرتی هوک ها با تعریف Getter و Setter به صورت مستقیم در تعریف ویژگی کلاس عمل میکنند. بهجای تعریف ویژگیهای ساده، شما از قالب زیر استفاده میکنید:
class ClassName {
public Type $propertyName {
get => /* Expressing the return code or value */;
set => /* Code expression for initialization */;
}
}توضیح ساختار:
get => ...:
برای زمانی که ویژگی خوانده میشود.
$value = $object->propertyName;
میتوانید یک مقدار ثابت، مقدار محاسبهشده، یا نتیجهٔ یک فراخوانی تابع را بازگردانید.
set => ...:
برای زمانی که به ویژگی مقدار اختصاص داده میشود.
$object->propertyName = 'value';
معمولاً برای مقداردهی، کدی تعریف میشود که داده را پردازش یا اعتبارسنجی میکند.
- مثال
فرض کنید یک کلاس داریم که نام کامل کاربر را مدیریت میکند.
میخواهیم نام کامل به صورت ترکیب firstName و lastName باشد، اما به جای تعریف متدهای جداگانه از پراپرتی هوک ها استفاده میکنیم.
class User {
public function __construct(
private string $firstName,
private string $lastName
) { }
public string $fullName {
get => "{$this->firstName} {$this->lastName}";
set => [$this->firstName, $this->lastName] = explode(' ', $value, 2);
}
}استفاده و توضیح:
$user = new User('John', 'Doe');
echo $user->fullName; // John Doeدر اینجا، مقدار fullName از ترکیب firstName و lastName تولید شده است.
$user->fullName = 'Jane Doe';
echo $user->firstName; // Jane
echo $user->lastName; // Doe
مقدار fullName به دو بخش firstName و lastName تقسیم شده و در ویژگیهای مربوطه ذخیره میشود.
- اعمال عملیات پیچیده تر
Getter و Setter می توانند به صورت چند خطی و مانند توابع پیاده سازی شوند تا عملیات های پیچیده تری را در هنگام Get و Set پراپتری ها انجام دهد.
مثال:
فرض کنید در یک کلاس، یک ویژگی age داریم، اما سن کاربر به صورت تاریخ تولد در دیتابیس ذخیره میشود. در این حالت:
getter باید تاریخ تولد را به سن تبدیل کند.
setter باید سن ورودی را به تاریخ تولد تبدیل و ذخیره کند.
class User {
private DateTime $birthDate;
public function __construct(DateTime $birthDate) {
$this->birthDate = $birthDate;
}
public int $age {
get {
$currentDate = new DateTime();
$age = $currentDate->diff($this->birthDate)->y; // تفاوت به سال
return $age;
}
set (int $value) {
$currentDate = new DateTime();
$this->birthDate = (clone $currentDate)->sub(new DateInterval("P{$value}Y"));
}
}
}استفاده و توضیح:
getter (محاسبه سن):
مقدار تاریخ تولد که در ویژگی birthDate ذخیره شده است، با تاریخ فعلی مقایسه میشود.
اختلاف به سالها محاسبه میشود و بهعنوان سن کاربر بازگردانده میشود.
$user = new User(new DateTime('1990-01-01'));
echo $user->age; // 35setter (محاسبه تاریخ تولد):
سن ورودی (مثلاً ۳۰) از تاریخ فعلی کسر میشود تا تاریخ تولد کاربر بهدست آید.
مقدار محاسبهشده به ویژگی birthDate اختصاص داده میشود.
$user->age = 30;
echo $user->birthDate->format('Y-m-d'); // 1995-01-01
- کاربردهای پراپرتی هوک ها
1- محاسبات پویا: میتوانید ویژگیهایی ایجاد کنید که مقدار آنها بهصورت پویا بر اساس شرایط محاسبه شود.
2- اعتبارسنجی دادهها: میتوانید دادههای ورودی را قبل از ذخیرهسازی اعتبارسنجی کنید.
3- ساختارهای پیچیده: امکان تبدیل خودکار دادههای ورودی به ساختارهای پیچیدهتر وجود دارد.
- مقایسه با مجیک متدها
پراپرتی هوک ها می توانند برای هر پراپرتی به صورت مجزا تعریف شوند، برخلاف مجیک متد ها که به تمامی پراپرتی ها اعمال می شوند.
ردیابی خطاها در پراپرتی هوک ها بسیار ساده تر از مجیک متد ها می باشد، همچنین خوانایی بسیار بالاتری نسبت به مجیک متد ها را دارا می باشند.
🔖 #PHP, #پی_اچ_پی
👤 AmirHossein
💎 Channel: @DevelopixPHP