تفاوت self، parent و static در php
سه کلمهی کلیدی self و parent و static در php برای برنامهنویسان تازه کار کمی پیچیده به نظر میرسند. در ادامه تلاش میکنیم تا به شکلی ساده و کوتاه، تفاوتها و کاربردهای هر کدام از این سه کلمه را بررسی کنیم.
۱- parent
parent:: برای دسترسی به اعضای (مثل متدها و خصوصیات) کلاس پدر به کار میرود. فرض کنید در حال نوشتن یک چارچوب تست هستید. احتمالا یک کلاس پایه به نام BaseTestCase خواهید داشت که شامل متدهایی برای راهاندازی (setup) و جمعآوری (teardown) محیط تست است.
حالا اگر کلاسی برای تست کردن یک ویژگی خاص به نام FeatureTest ایجاد کنید، این کلاس از BaseTestCase ارثبری میکند. با استفاده از parent::setup در ابتدای متد setup کلاس FeatureTest میتوانید کدهای راهاندازی که در تابع پدر تعریف شده را فراخوانی کنید و سپس عملکردهای اضافی مورد نیاز برای تست ویژگی خاص را انجام دهید.
۲- self
self:: برای اشاره به کلاس جاری که در آن قرار دارد استفاده میشود. این کلمه زمانی کاربرد دارد که میخواهید به اعضای ایستا (static) که مستقیما به نمونهی خاصی از یک کلاس وابسته نیستند، دسترسی پیدا کنید.
برای مثال، فرض کنید کلاسی به نام Logger دارید که یک خصوصیت ایستا به نام logLevel دارد که سطح لاگگیری را مشخص میکند. در هر کجای برنامه که باشید، میتوانید با استفاده از self::logLevel به این سطح دسترسی داشته باشید و در صورت نیاز آن را تغییر دهید.
۳- static
static:: شبیه به self:: است، اما تحت تاثیر Late Static Binding قرار میگیرد. این موضوع زمانی اهمیت پیدا میکند که با کلاسهای ارثبرنده (child class) سر و کار دارید. مثلا، فرض کنید کلاسی به نام FileLogger از Logger ارثبری میکند و میخواهد سطح لاگگیری را به مقدار دیگری تغییر دهد.
با استفاده از self::logLevel در متدهای FileLogger همچنان به سطح لاگگیری تعریفشده در کلاس Logger دسترسی پیدا خواهید کرد. این به این دلیل است که self:: در زمان تعریف شدن متد، به کلاس جاری (یعنی Logger) اشاره میکند. برای اینکه سطح لاگگیری در کلاس FileLogger اعمال شود، باید از static::logLevel استفاده کنید.
هر کدام از کلمات بالا چه زمانی کاربرد دارد ؟
تصمیمگیری در مورد استفاده از self:: یا static:: به مورد خاص بستگی دارد. اگر کلاسی را میسازید که قرار است از آن ارث بری شود و میخواهید به زیرمجموعهها اجازه دهید تا رفتار را شخصیسازی کنند، بهتر است از static:: استفاده کنید. در غیر این صورت میتوانید از self:: استفاده کنید. همچنین اگر نمیخواهید از کلاستان ارث بری شود، میتوانید از کلیدواژهی final هنگام تعریف کلاس استفاده کنید.
این مقاله به شما در درک تفاوت بین parent, static و self کمک میکند. تسلط بر این مفاهیم به نوشتن کد تمیزتر، قابل نگهداریتر و انعطافپذیرتر در PHP منجر میشود. برای یادگیری و مشاهدهی مثالهای مربوط میتوانید به راهنمای php برای این کلمات مراجعه کنید.