TGViewer
| کانال توسعه‌دهندگان PHP | | کانال توسعه‌دهندگان PHP | @developixphp · 1.68K subscribers
Post #55 896
پراپرتی هوک ها (Property Hooks)

این ویژگی‌ در 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; // 35


‏setter (محاسبه تاریخ تولد):
سن ورودی (مثلاً ۳۰) از تاریخ فعلی کسر می‌شود تا تاریخ تولد کاربر به‌دست آید.
مقدار محاسبه‌شده به ویژگی birthDate اختصاص داده می‌شود.
$user->age = 30;
echo $user->birthDate->format('Y-m-d'); // 1995-01-01


- کاربردهای پراپرتی هوک ها

1- محاسبات پویا: می‌توانید ویژگی‌هایی ایجاد کنید که مقدار آن‌ها به‌صورت پویا بر اساس شرایط محاسبه شود.
2- اعتبارسنجی داده‌ها: می‌توانید داده‌های ورودی را قبل از ذخیره‌سازی اعتبارسنجی کنید.
3- ساختارهای پیچیده: امکان تبدیل خودکار داده‌های ورودی به ساختارهای پیچیده‌تر وجود دارد.

- مقایسه با مجیک متدها

پراپرتی هوک ها می توانند برای هر پراپرتی به صورت مجزا تعریف شوند، برخلاف مجیک متد ها که به تمامی پراپرتی ها اعمال می شوند.
ردیابی خطاها در پراپرتی هوک ها بسیار ساده تر از مجیک متد ها می باشد، همچنین خوانایی بسیار بالاتری نسبت به مجیک متد ها را دارا می باشند.

🔖 #PHP, #پی_اچ_پی

👤 AmirHossein

💎 Channel: @DevelopixPHP
  • 👍 5
  • ❤ 2
More from @developixphp
  1. Sep 26, 2026این کد موقع اجرا چه خروجی‌ای می‌ده و مشکلش کجاست؟ 🔖 #PHP #پی_اچ_پی 👤 Developix 💎 Channe…
  2. Sep 25, 2026🔥 پکیج: قراردادهای ترجمه سیمفونی اگر کد PHP را برای چندزبانگی می‌نویسید، بهتر است منطق بر…
  3. Sep 16, 2026🚀 ‏LaraGram Brain منتشر شد! از این به بعد برای ساخت ربات‌های تلگرام با فریم‌ورک LaraG…
  4. Sep 11, 2026ارسال ایمیل تأیید ثبت‌نام، بازیابی رمز عبور یا نوتیفیکیشن سفارش، تقریباً توی هر پروژه‌ PHP…
  5. Sep 10, 2026برنامه نویسی سوکت در PHP بخش اول عبارت دیگر در ارتباط های غیر سوکت برای ارسال یک پالس از س…
  6. Aug 31, 2026🔥 پکیج: استاندارد PSR-11 برای Container استاندارد PSR-11 فقط یه interface مشترک برای Cont…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →