سطح دسترسی (PHP Access Modifiers)
سطوحِ دسترسی: مرزهایِ قدرت 🔐🛡️
یکی از ارکانِ اصلیِ OOP، "کپسولهسازی" (Encapsulation) است. یعنی ما تعیین میکنیم چه کسی به اطلاعاتِ داخلِ کلاس دسترسی داشته باشد.
سه سطحِ دسترسی در PHP:
- public: آزاد برایِ همه! از هر جایِ برنامه میتوان به آن دسترسی داشت. (پیشفرض)
- protected: فقط برایِ "خودیها"! فقط داخلِ خودِ کلاس و کلاسهایی که از آن ارث بردهاند قابلِ استفاده است.
- private: کاملاً شخصی! فقط و فقط داخلِ همان کلاس قابلِ دسترسی است.
چرا از Private استفاده کنیم؟
برایِ جلوگیری از دستکاریِ اشتباهِ دادهها. مثلاً "موجودیِ حساب" نباید مستقیماً قابلِ تغییر باشد؛ باید از طریقِ یک متدِ واریز (Deposit) که محدودیتها را چک میکند، تغییر یابد.
private از بیرونِ کلاس، باعثِ توقفِ برنامه با خطایِ Fatal Error میشود.
private یا protected تعریف کنید و فقط از طریقِ متدهای public به آنها دسترسی بدهید.
ست کردنِ دسترسی:
{code_block('class Bank {\n private $balance;\n protected $accountType;\n public $name;\n}')}بخش تخصصی: معماریِ پیشرفته و مهندسیِ اشیاء 🐘💎
برنامهنویسیِ شیءگرا در PHP پس از نسخهیِ ۷ و ۸ تغییراتِ بنیادینی داشته و به ابزاری بسیار قدرتمند برایِ ساختِ سیستمهایِ پیچیده تبدیل شده است.
۱. ساختارِ حافظه و Object Handles
در PHP، متغیرهایی که حاویِ یک شیء هستند، خودِ شیء را ذخیره نمیکنند؛ بلکه یک Identifier یا دستگیره (Handle) را نگه میدارند که به جدولِ اشیاءِ درونیِ موتورِ Zend Engine اشاره میکند. به همین دلیل است که وقتی یک شیء را به تابعی پاس میدهید، تغییرات در همان شیءِ اصلی اعمال میشود (شبهارجاع).
۲. رعایتِ اصولِ SOLID
در طراحیِ کلاسها، همیشه به اصلِ Single Responsibility پایبند باشید. یک کلاس باید فقط یک دلیل برایِ تغییر داشته باشد. استفاده از Interfaces به شما اجازه میدهد وابستگیهایِ کدتان را به حداقل برسانید (Dependency Inversion).
۳. کدهایِ JIT-Friendly
موتورِ JIT در PHP 8 کدها را به زبانِ ماشین تبدیل میکند. نوشتنِ کدهایِ شیءگرا با ساختارِ مشخص و استفاده از Property Typing به JIT کمک میکند تا کدهایِ شما را بسیار بهینهتر اجرا کند.
تمرینهای عملی
برای تثبیت یادگیری این درس تمرینهای زیر را حل کنید
در کلاسِ User، یک ویژگی به نام password را به صورت private تعریف کنید.
<?php
class User {
private $password;
}
?>
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.