اهمم... اولا يک عذرخواهی به خاطر دير به دير آپديت شدن اينجا؛ اين ماه گرفتاری بسی زياد است. اما می تونم قول مطالب توپ و جديد رو در آينده نزديک بدم. ثانيا مثل اينکه يک آدم بيکاری، اين وبلاگ رو در BlogRolling پينگ می کنه و جماعت وبگرد فکر می کنند اينجا خبريه و افسار مرورگرشون رو می کشند و به کلبه حقير سری می زنند. يه توصیه دوستانه به اين آقای بيکار؛ نکن آقا/خانم!
بريم سر اصل مطلب؛ امروز باز هم کمی به امکانات جدید شی گرايی در PHP 5 می پردازم.
از اين پس در PHP می توان متدها و Propertyهای يک کلاس را به صورت استاتيک تعريف کرد. يک متد استاتيک به جای وابستگی به يک نمونه از کلاس به خود کلاس وابسته بوده و محدوده عمل آن در سطح کليه نمونه های آن کلاس(Objectها) است. فراخوانی متدهای استاتيک با استفاده از سينتکس:
صورت می گيرد. داخل متدهای استاتيک، از this$ که معرف نمونه کلاس(آبجکت) است نمی توان استفاده کرد. چرا؟! چون همانطور که گفتيم متدهای استاتيک برای تمام نمونه کلاس ها يکسان و ثابت بوده و مقيد به آبجکت های ساخته شده نيستند.
حالا يک مشخصه(Property) استاتيک، يک متغيری در سطح کلاس است و مقيد به نمونه های آن کلاس نيست. يعنی تغيير در مقدار اين متغير، در تمام نمونه های گرفته شده از کلاس مذکور منعکس می شود. مشخصه های استاتيک را با کلمه کليدی static تعريف می کنيم و نحوه دسترسی به آن هم با سينتکس:
ميسر است. مثال زير، نحوه کار مشخصه های استاتيک را نشان می دهد:
<?php
class TestClass {
public static $counter;
}
$counter = TestClass::$counter;
?>
* کلمه کليدی Public به اين معنی هست که به طور مستقيم می توان به اين متغير دسترسی يافت.(در بحث Encapsulation و پنهان سازی داده ها از دید کاربر کلاس مطرح می شود)
گاهی اوقات پيش می آيد که بخواهيد از داخل خود کلاس به مشخصه استاتيک آن دسترسی بيابيد؛ برای اين منظور می توان از دو کلمه کليدی جادويی به نام های self و parent بهره برد. که به ترتيب به خود کلاس و والد کلاس اشاره می کنند. با بهره گیری از self و parent ديگر لازم نيست برای ارجاع به يک کلاس، از نام آن استفاده کنيد.در مثال پايين با يک مثال ساده نحوه استفاده از مشخصه های استاتيک و انتساب يک شناسه منحصر به فرد عددی به هر نمونه از کلاس شرح داده شده است:
<?php
class TestClass {
public static $counter = 0;
public $id;
public function __construct()
{
$this->id = self::$counter++;
}
}
?>
در PHP 4 چیزی به نام متدها و مشخصه های استاتيک نداريم؛ يعنی بهتر هست بگيم پشتيبانی صريحی از متدهای استاتيک به عمل نيامده است. اما با استفاده از سينتکس ()ClassName::function امکان فراخوانی متدی از کلاس وجود دارد. چنين متدی را می توان يک متد استاتيک در نظر گرفت، البته تا زمانی که به يک مشخصه از کلاس اشاره نکند.
من به شخصه برای تمام اپليکيشنهای تحت وبی که می نويسم يک کلاس کلی دارم به نام MainLib که توابع مورد نياز و مشترک بين ساير کلاس ها را در آن قرار داده ام، برای مثال متدی برای بررسی magic_quotes_gpc و تعيين خروجی، تابعی برای تبديل تاريخ شمسی به ميلادی و بالعکس، تابعی برای راه اندازی Template Engine و تفسير و جايگذاری مقادير، تابعی برای ايجاد Navigationهای دلخواه و ....
حال تمام کلاس های ديگر سايت که کار مختص به خود را انجام می دهند، فرزند اين کلاس اصلی هستند و استاتيک بودن متدهای کلاس اصلی، اين امکان را می دهد که از آنها در برنامه نويسی ماجولار هم بهره برد و صرفا منحصر به نمونه کلاس ها و آبجکت ها نباشد. با استفاده از الگوی طراحی Front Controller کلیه ماجول ها را از یک صفحه اصلی مشتق می کنم و با تکنیک توابع متغیر(پست پایین) ماجول های مورد نیاز را فراخوانی میکنم، در هر ماجول کلاس مربوطه نمونه گیری شده و تمام کارهایی که باید در آن ماجول انجام شود، در کلاس گنجانده می شود. من با اتخاذ چنين روشی در کدنويسی، خيلی راحت و دقيق بين کليت کلاس ها و ماجول های برنامه، يکپارچگی خاصی ايجاد می کنم و بدين ترتيب کار توسعه ديگر ملال آور نمی شود و باعث میشود من همچنان PHP را دوست بدارم! 
|