با سلام، این مقاله، مقاله ی دوم از ضمیمه های برنامه نویسی شیء گرا PHP است. در این قسمت می خواهیم با متدها و خصوصیات استاتیک (static) آشنا شویم.
در بعضی از موارد خاص می میخواهیم بدون ساختن یک شی از یک کلاس به خصوصیات و متدهای آن دسترسی داشته باشیم. در چنین حالتی می توانیم متدها و خصوصیات آن کلاس را به صورت استاتیک تعریف کنیم.
باید ذکر کنیم که از نظر کد نویسی استفاده از متدها و خصوصیات استاتیک پیشنهاد نمی شود و عادت بدی است اما در بعضی از موارد خاص توجیه پذیر است.
تا به حال با سه عدد از access modifier ها آشنا شده اید: Public و Private و Protected؛ کلید واژه ی Static چهارمین access modifier می باشد.
برای تعیین یک خصوصیت یا متد به عنوان متد یا خصوصیتِ استاتیک باید از کلید واژه ی static استفاده کنید:
class Utilis { // static methods and properties are defined with the static keyword. static public $numCars = 0; }
برای استفاده از این متدها و خصوصیات از اپراتور scope resolution (::) استفاده می کنیم. در جلسات قبل در مورد این اپراتور صحبت کردیم. این اپراتور که علامتش دو جفت دو نقطه می باشد، به شما اجازه می دهد به متدها و خصوصیات استاتیک (static) و ثابت (constant) و همینطور به متدها و خصوصیات override شده دسترسی پیدا کنید. مطالعه ی بیشتر در مورد این اپراتور در این لینک.
در مثال زیر، برای کار با خصوصیت استاتیکِ numCars$ از این اپراتور استفاده می کنیم:
// تعیین کردن تعداد ماشین ها Utilis::$numCars = 3; // دریافت تعداد ماشین ها echo Utilis::$numCars;
نتیجه ی این کد عدد 3 خواهد بود.
نکته: دقت کنید که بعد از این اپراتور از علامت $ استفاده کرده ایم! این ساختار را از یاد نبرید.
اگر یادتان باشد ما از کلید واژه ی this$ استفاده می کردیم تا به متدها و خصوصیات یک کلاس، در درونِ خودش اشاره کنیم. حال برای اشاره به متدها و خصوصیات استاتیک از کلید واژه ی self استفاده می کنیم.
در مثال زیر تابعی به نام ()addToNumCars (به معنی "بر تعداد ماشین ها اضافه کن") داریم. کار این تابع این است که ابتدا تعداد ماشین ها را در درون خود کلاس از خصوصیت استاتیک numCars$ بگیرد، آن هم با استفاده از کلید واژه ی self:
class Utilis { static public $numCars = 0; static public function addToNumCars($int) { $int = (int)$int; self::$numCars += $int; } }
حالا از کدی که قبلا نوشته بودیم کمک میگیریم و تعداد ماشین ها را تعیین کرده و دوباره میگیریم:
echo Utilis::$numCars; Utilis::addToNumCars(3); echo Utilis::$numCars; Utilis::addToNumCars(-1); echo Utilis::$numCars;
خروجی این کد به ترتیب عدد های 0 و 3 و 2 خواند بود.
دلیل اصلی استفاده از این متدها و خصوصیات، نیاز به شمارنده ها (counter) و کلاس های ابزاری (utility classes) است. در واقع همانطور که گفتیم استفاده از متدها و خصوصیات استاتیک توصیه شده نیست اما برخی اوقات ممکن است نیاز پیدا کنید که از یک متد یا خصوصیت بدون ساختن هیچ شیء ای استفاده کنید. حتما سوال میپرسید که شمارنده ها و کلاس های ابزاری (نام دیگرشان کلاس های کمکی (Helper) است) چه هستند...
شمارنده ها می توانند آخرین مقداری که به آن ها داده شده را ذخیره نگه دارند. به طور مثال متد ()add1ToCars هر بار که صدا زده شود یک واحد به خصوصیت numberOfCars$ اضافه می کند:
class Utilis { // تعداد ماشین ها را ذخیره نگه می دارد static public $numberOfCars = 0; // هر بار که متد صدا زده شود یک واحد به تعداد ماشین ها اضافه کن static public function add1ToCars() { self::$numberOfCars++; } } echo Utilis::$numberOfCars; Utilis::add1ToCars(); echo Utilis::$numberOfCars; Utilis::add1ToCars(); echo Utilis::$numberOfCars; Utilis::add1ToCars(); echo Utilis::$numberOfCars;
خروجی کد ما به ترتیب به صورت 0 و 1 و 2 و 3 خواهد بود.
استفاده از متدهای استاتیک برای utility class ها بسیار شایع است. تنها فلسفه ی وجودی utility class ها، ارائه ی خدمات به کلاس های اصلی است (برای همین نامشان کلاس های ابزاری یا کمکی است).
utility class ها می توانند انواع وظایف مختلف را انجام دهند که از جمله ی آن ها می توان این موارد را نام برد: تبدیل واحد های اندازه گیری به هم (مانند پوند به کیلوگرم و ...)، کد گذاری (encryption)، پاک سازی داده های ورودی (sanitation) و هر چیز دیگری که به غیر از خدمتی به کلاس های اصلی هدفی در برنامه ما ندارد.
مثال زیر متد استاتیکی با نام redirect است که کاربر را به URL ای که ما تعیین کنیم redirect می کند:
class Utilis { //(ها Header این متد کاربر را به صفحه ی جدیدی انتقال می دهد (با استفاده از static public function redirect($url) { header("Location: $url"); exit; } }
حالا برای استفاده از متد ()redirect تنها کافیست که آن را از کلاس Utilis صدا بزنیم، بدون اینکه نیاز باشد شیء ای برایش بسازیم.
Utilis::redirect("https://www.roxo.ir/plus");
هر زمان که خواستید از متدها یا خصوصیات استاتیک استفاده کنید، اطمینان حاصل کنید که هدف شما استفاده برای utility class ها است و هیچ وقت برای راحتی کار از آن ها استفاده نکنید چرا که استفاده از static بدی های زیر را دارد:
مخلص کلام: استفاده از static فقط برای کلاس های ابزاری باشد، نه از زیر کار در رفتن و راحتی شما!
امیدوارم از این قسمت استفاده ی کافی را برده باشید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.