سلام دوستان
سه مفهوم استاتیک :
1- فیلد استاتیک
2- متد استاتیک
3- متغیر محلی استاتیک
تفاوتشون چیه؟؟
واگه شد یه جزوه خوب برای مفاهیم پایه ی php معرفی کنید؟؟؟؟؟
فیلد استاتیک
به متغیرهایی که توی بدنهی کلاس (نه داخل متدهای اون کلاس) با کلمهی کلیدی static تعریف میشن، فیلد استاتیک میگیم. هدف از کاربرد این فیلدها، نگهداشتن یکسری اطلاعات مستقل از اشیاء کلاس هست. این فیلدها در زمان بارگذاری خود کلاس در حافظه (نه ایجاد یک شئ از کلاس)، مقداردهی اولیه میشن و تا پایان اجرای اسکریپت، مقدار خودشون رو حفظ میکنن (اگه تغییرش ندیم). اگه این فیلدها private یا protected باشن فقط توی متدهای کلاس میتونیم بصورت زیر بهشون دسترسی پیدا کنیم:
self::$fieldName
که در اینجا
$fieldName اسم متغیر یا فیلد استاتیکی هست که تعریف کردیم. تمام متدهای کلاس میتونن به فیلدهای استاتیک باکمک ساختاری که گفتیم دسترسی پیدا کنن.
حالا اگه همین فیلدها رو بصورت public تعریف کنیم، میتونیم خارج از کلاس هم باکمک اسم کلاس بهشون دسترسی پیدا کنیم:
ClassName::$fieldName
که در اینجا ClassName اسم کلاسی هست که فیلد رو داخلش تعریف کردیم و
$fieldName هم اسم فیلد استاتیک موردنظر هست.
درصورتی که به یک فیلد استاتیک دسترسی داشته باشیم، هم میتونیم مقدارش رو بخونیم و هم تغییر بدیم. تنها تفاوت این فیلدها با فیلدهای معمولی (غیر استاتیک) اینه که فیلدهای معمولی بهازای هر شئ از کلاس، یک مقدار مخصوص و جداگانه دارن و درواقع یک نسخهی مخصوص همون شئ از اون متغیر ایجاد میشه ولی فیلدهای استاتیک مختص کلاس هستن و چون از هر کلاس، فقط یک تعریف در حافظه وجود داره (که میتونه بینهایت شئ ازش ایجاد بشه)، بنابراین فقط یک نسخه از فیلدهای استاتیک هم در حافظه وجود خواهد داشت.
متد استاتیک
متدهای استاتیک متدهایی هستن که روی خود کلاس تعریف میشن نه اشیاء کلاس. گاهی اوقات توی برنامهنویسی شئگرا نیاز به متدهایی پیدا میکنید که باید ازطریق خود کلاس فراخوانی بشن و وابسته به شئ خاصی از اون کلاس نیستن. برای مثال ممکنه هدف از ایجاد یک کلاس، صرفاً جمعآوری یکسری متد مرتبط با هم ازنظر معنایی، داخل یک ظرف مشترک باشه. مثلاً کلاسی بهاسم Math تعریف کنید و متدهای add و sub و multiply و div و reminder و power و... رو داخلش تعریف کنید. در اینجا برای استفاده از این متدها، واقعاً ایجاد یک شئ از کلاس بیفایده است چون شئ زمانی معنا داره که یک موجودیت با هویت مستقل داشته باشیم که پارامترها (فیلدها) و رفتارها (متدها) مخصوص به خودش رو داشته باشه اما این متدهایی که گفتیم، مشترک هستن و پارامترهای خودشون رو از ورودی دریافت میکنن و نتیجه رو return میکنن.
در این حالت ایجاد یک شئ از کلاس و استفاده از این متدها روی اون شئ (مشابه متدهای معمولی یا غیر استاتیک)، فقط داره حافظهی بیهوده مصرف میکنه چون تمام کاری که شما میخواین با اون شئ انجام بدین، صدازدن همین متدها و ارسال پارامترهای ورودی و گرفتن جواب خروجی از اون متده که برای اینکار استفاده از متدهای استاتیک مناسبتره.
برای فراخوانی متدهای استاتیک داخل بدنهی کلاس میتونیم از ساختار زیر استفاده کنیم:
self::methodName($param1, $param2, ...)
که البته اگه متد مربوطه بصورت public تعریف شده باشه، خارج از کلاس هم میتونیم بصورت زیر صداش بزنیم:
ClassName::methodName($param1, $param2, ...)
از اونجا که این متدها ازطریق اسم کلاس فراخوانی میشن (نه اسم شئ ایجادشده از کلاس)، بنابراین موقع فراخوانی اونها درعمل شیئی وجود نداره و به همین دلیل، توی متدهای استاتیک نمیتونیم فیلدهای غیراستاتیک یا متدهای غیراستاتیک رو فراخوانی کنیم. درواقع توی متدهای استاتیک به
$this دسترسی نداریم چون
$this به شئ جاری از کلاس اشاره میکنه درحالی که توی این متدها اصلاً شیئی وجود نداره که بخوایم بهش دسترسی پیدا کنیم.
متغیر محلی استاتیک
اگه یه متغیر رو داخل یک تابع یا متد تعریف کنیم، بهش میگن متغیر محلی. معنای محلیبودن اینه که این متغیر در همون محل تعریفش (داخل اون تابع یا متد) اعتبار داره. همونجا تعریف میشه، مقدار میگیره، کارهای لازم باهاش انجام میشه و بعد هم موقع خروج از تابع یا متد از بین میره (متد به تابعی میگن که توی کلاس تعریف شده باشه).
در شرایط خاصی ممکنه نیاز داشته باشیم که یه متغیر محلی، با خروج از تابع یا متد، از بین نره و آخرین مقدارش رو نگه داریم تا موقع فراخوانی بعدی اون تابع یا متد بتونیم بخونیمش و کار رو با آخرین مقداری که داشته (توی فراخوانی قبلی) ادامه بدیم. در این حالتها اون متغیر محلی رو با کلمه کلیدی static تعریف میکنیم. برای مثال:
function counter()
{
static $x = 0;
$x++;
return $x;
}
توی این کد، اولیندفعه که متد یا تابع counter رو فراخوانی میکنیم، دستور
static $x = 0; اجرا میشه چون متغیر محلی
$x وجود نداره و باید تعریف بشه. پس مقدار اولیهی صفر هم بهش داده میشه. بعد مقدارش یکواحد اضافه میشه و مقدار جدید یعنی 1 برگردونده میشه. نکتهی مهم اینجاست که توی دفعات بعدی که این متد رو صدا میزنیم، این متغیر محلی برای اون تابع یا متد، یه جایی توی حافظه نگهداری میشه و وقتی وارد متد یا تابع counter میشیم، متغیر
$x مقدار اولیه داره (که همون مقدار 1 هست که قبل از خروج از تابع یا متد داشته) و درنتیجه دستور اول که این متغیر رو تعریف و مقداردهی اولیه میکنه، دیگه اجرا نمیشه و به مقدار قبلی که 1 بوده، یک واحد اضافه میشه و میشه 2 و برگردونده میشه. بههمینترتیب در دفعات اجرای بعدی مقادیر 3 و 4 و... برگشت داده میشه.
خواهش میکنم. البته کاربرد دکمهی تشکر قشنگتره