آموزش property های استاتیک در PHP شی گرا


آموزش متدها و property های Static در PHP شی گرا

همیشه لازم نیست برای دسترسی به متدها و property های یک کلاس از روی آن آبجکت بسازید. در واقع توسعه دهنده می تواند با تعریف متدها و property های کلاس به صورت static، به راحتی بدون ساخت آبجکت از روی کلاس میزبان به این متدها و property ها دسترسی داشته باشد. اگرچه در کل استفاده از متدهای static و property های static توصیه نمی شود، با این حال مواردی پیش می آید که در آن این امکان می تواند بسیار کارا باشد.

قبلا با access modifier ها و سطوح دسترسی public، protected و private آشنا شدیم.این آموزش به شرح تنظیم کننده ی سطح دسترسی static می پردازد.

آنچه خواهید آموخت:

  1. نحوه ی تعریف متدها و property ها به صورت static را بیاموزید.
  2. نحوه ی دسترسی به متدهای static از داخل کلاس میزبان را یاد بگیرید.
  3. بیاموزید چه زمانی باید از property ها و متدهای static استفاده نمایید.
  4. دلیل عدم استفاده ی زیاد از کلیدواژه ی static را درک کنید.

چگونگی تعریف متدها و property ها به صورت static

جهت تعریف متد و property به صورت static، کافی است عضو مورد نظر از کلاس را با کلیدواژه ی static نشانه گذاری نمایید. در مثال زیر، کلاس Utilis یک property با سطح دسترسی public و اسم $numCars دارد. می بینید که دو کلیدواژه ی static و public هر دو قبل از اسم متغیر مورد نظر درج شده اند.

class Utilis {    // static methods and properties are defined with the static keyword.    static public $numCars = 0;  }  

چگونگی دسترسی به متدها و property های static

به منظور دسترسی به متدها و property هایی که به صورت static تعریف شده اند، بایستی از عملگر (::) استفاده کنیم. در مثال حاضر می بینید که جهت کار با متغیر $numCars از دستور نحوی زیر استفاده می کنیم:

// set the number of cars  Utilis::$numCars = 3;  // get the number of cars  echo Utilis::$numCars;  

نتیجه:

3

همان طور که می بینید بلافاصله پس از عملگر “::” از علامت $ استفاده شده است.

نحوه ی دسترسی به متدهای static از داخل کلاس میزبان

همان طور که از کلیدواژه ی $this برای دسترسی به property ها و متدهای کلاس استفاده می کردیم، از کلیدواژه ی self نیز می توانیم جهت دستیابی به property ها و متدهای static کلاس میزبان (جاری) استفاده نماییم.

در مثال زیر، متد addToNumCars() تعداد اتومبیل ها را با استفاده از کلیدواژه ی self از property ای به نام $numCars خوانده و سپس آن را داخل همان کلاس میزبان مقداردهی می کند.

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  

چه هنگام استفاده از property ها و متدهای static توصیه می شود؟

توسعه دهندگان معمولا در دو مورد زیر property و متد static را داخل کلاس میزبان فراخوانی می کنند:

  • زمانی که نیاز داشته باشند از مقدار متغیر عضو به عنوان شمارنده (counter) استفاده کند.
  • زمانی که بخواهند از متدها برای کلاس های کمکی (utility classes) استفاده نماید.

به طور کلی استفاده از متدها و property هایی که به صورت static تعریف شده، روشی کارامد تلقی نمی شود. با این وجود گاه شرایطی به وجود می آید که دسترسی به متغیر و متد عضو بدون نیاز به ایجاد آبجکت از روی کلاس میزبان می تواند بسیار کارا باشد. مواردی اصلی که در آن متدها و proprety های static توصیه می شود عبارتند از:

  • استفاده از property ای که به صورت static تعریف شده به عنوان شمارنده (counter).
  • استفاده از متدهایی که به صورت static تعریف شده اند در کلاس های کمکی (utility class).

استفاده از متغیرهای static به عنوان شمارنده

می توانیم از property هایی که به صورت static تعریف شده اند به عنوان شمارنده استفاده کنیم چرا که این نوع property ها قادرند آخرین مقداری که به آن تخصیص یافته را نگه دارند. به عنوان مثال، متد add1ToCars() در هر بار فراخوانی، یک واحد به مقدار متغیر $numberOfCars اضافه می کند.

class Utilis {    // Hold the number of cars.    static public $numberOfCars = 0;    // Add 1 to the number of cars each time the method is called.    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  

استفاده از متدهای static در کلاس های کمکی (utility class)

بسیاری از توسعه دهندگان از متدهای static در کلاس های کمکی (utility class) استفاده می کنند. تنها هدفی که کلاس های کمکی دنبال می کنند، سرویس دهی به کلاس اصلی می باشد. متدهای کمکی (utility method) قادرند انواع عملیات از جمله تبدیل بین واحدهای اندازه گیری (کلیوگرم به پوند)، رمزنگاری داده ها (encryption)، بهسازی (sanitation) و هر کار دیگری که به کلاس اصلی اپلیکیشن ما سرویس دهی می کند، اشاره کرد.

در مثال زیر یک متد static به نام redirect را مشاهده می کنید که کاربر را به آدرس URL ای که به عنوان آرگومان به آن ارسال شده است، هدایت می کند.

class Utilis {    // The method uses PHP's header function to redirect the user.    static public function redirect($url)    {      header("Location: $url");      exit;    }  }  

جهت استفاده از متد redirect()، کافی است آن را از (داخل محدوده ی دسترسی) کلاس Utilitis، بدون اینکه قبلش یک آبجکت از روی کلاس میزبان ایجاد کرده باشیم، فراخوانی نماییم:

Utilis::redirect("http://www.phpenthusiast.com");

چرا باید در استفاده از کلیدواژه ی static مراقب بود؟

توصیه می شود از کلیدواژه ی static منحصرا در کلاس های کمکی و برای سرویس دهی به کلاس اصلی اسکریپت خود استفاده نمایید. استفاده از امکان static در غیر این شرایط توصیه نمی شود.

اگرچه برای فراخوانی متدها و property های static نیازی به ساخت آبجکت از روی کلاس میزبان نیست و توسعه دهنده ممکن است به همین دلیل در استفاده از آن ها احساس راحتی بکند، اما باید بخاطر داشت که این دست از اعضای کلاس (static) کاستی هایی نیز دارند که به شرح زیر می باشد:

  1. در اجرای تست های خودکار بر روی کلاس هایی که از متدهای static استفاده می کنند، با مشکل مواجه خواهید شد.
  2. متدها و متغیرهای static به مثابه ی اعضای سراسری درنظرگرفته شده و کد خارج از کلاس می تواند به آن دسترسی داشته باشد. این اتفاقی است که تا حد امکان باید از رخداد آن جلوگیری شود.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *