آموزش اعتبار سنجی پارامترهای ورودی


آموزش type hinting در PHP شی گرا / آموزش اعتبارسنجی پارامترهای ورودی

Type hinting در PHP این امکان را به ما می دهد تا نوع پارامترهای ورودی مورد انتظار (و مجاز) را به هنگام اعلان تابع مشخص کرده و به عبارت دیگر پارامترهای ارسالی به تابع را اعتبارسنجی نماییم. بنابراین به وسیله ی قابلیت TYPE HINTING در PHP برنامه نویس می تواند نوع داده ی مقادیری که به هنگام فراخوانی تابع به آن فرستاده می شوند را مشخص و چنانچه از نوع مورد انتظار نبود آن را نپذیرد. استفاده از این روش می تواند در سازمان دهی هرچه بهتر کد موثر بوده و پیغام خطاها را بهینه نماید.

آموزش حاضر به شرح type hinting برای آرایه ها و آبجکت ها که هم در PHP5 و PHP7 پشتیبانی می شود، خواهد پرداخت. سپس Type hinting را برای انواع داده ای ساده (integer، float، string و boolean) که در PHP7 پشتیبانی می شود، می پردازد.

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

  1. چگونه تابع را مجبور به پذیرفتن مقادیر از نوع آرایه (array type hinting) کنیم؟
  2. چگونه تابع را مجبور به پذیرفتن مقادیر از جنس آبجکت کنیم؟
  3. چگونه type hinting را برای انواع داده ای ساده (اولیه) استفاده کنیم؟

چگونه تابع را مجبور به پذیرفتن مقادیر از نوع آرایه کنیم؟

در PHP می توان یک تابع را مجبور کرد فقط مقادیری از نوع آرایه را به عنوان ورودی بپذیرد. برای این منظور کافی است کلیدواژه ی array را قبل از اسم آرگومان، داخل پرانتزهای تابع درج نمایید:

function functionName (array $argumentName)  {    //code  }  

در مثال زیر، تابع calcNumMilesOnFullTank()، میزان مسافتی که اتومبیل بر حسب مایل با باک پر می تواند بپیماید را با استفاده از ظرفیت باک و تعداد مایلی که به ازای هر گالون (miles per gallon / mpg) می تواند بپیماید را محاسبه نماید. این تابع تنها آرگومان هایی از نوع آرایه را به عنوان پارامتر ورودی می پذیرد.

// The function can only get array as an argument.  function calcNumMilesOnFullTank(array $models)  {    foreach($models as $item)    {      echo $carModel = $item[0];      echo " : ";      echo $numberOfMiles = $item[1] * $item[2];      echo "
"; } }

ابتدا پارامتری غیر از نوع آرایه را به تابع ارسال کرده و می بینیم که چه رخ خواهد داد:

                          calcNumMilesOnFullTank("Toyota");  

خروجی:

Catchable fatal error: Argument 1 passed to calcNumMilesOnFullTank() must be of the type array, string given

این پیغام نشان دهنده ی خطایی است که در کد اپلیکیشن رخ می دهد. از این پیغام خطا مشخص می شود که تابع انتظار دریافت پارامتری از نوع آرایه را داشته و به محض ارسال پارامتری از نوع رشته به آن خطا می دهد.

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

$models = array(    array('Toyota', 12, 44),    array('BMW', 13, 41)  );  calcNumMilesOnFullTank($models);  

خروجی:

Toyota : 528 BMW : 533

خواهید دید که تابع با موفقیت اجرا می شود چراکه آرایه ی مورد انتظار را به عنوان پارامتر به آن ارسال کردیم.

مجبور کردن یک تابع به دریافت پارامتر از جنس آبجکت

می توان یک تابع را مجبور کرد که تنها آرگومان هایی از جنس آبجکت به عنوان ورودی قبول کرد. برای این منظور، اسم کلاس را قبل از اسم آرگومان در پرانتز درج نمایید. در مثال زیر، تابع سازنده ی کلاس (constructor) تنها می تواند آبجکت هایی که از روی کلاس Driver ساخته شده را به عنوان آرگومان بپذیرد. همان طور که در این مثال می بینید، کافی است اسم کلاس را قبل از اسم آرگومان درج نمایید:

class Car {    protected $driver;    // The constructor can only get Driver objects as arguments.    public function __construct(Driver $driver)    {      $this -> driver = $driver;    }  }  class Driver {}  $driver1 = new Driver();  $car1    = new Car($driver1);  

آیا PHP قابلیت Type hinting را برای انواع داده ای ساده نیز استفاده می کند؟

در جواب باید گفت که PHP5 امکان اعتبارسنجی پارامترهای ورودی از نوع اولیه (integer، float، string و boolean) را ندارد اما ویرایش 7 این زبان قابلیت اعتبارسنجی از نوع تک مقداری (scalar type hinting) را در اختیار توسعه دهنده قرار می دهد.

بنابراین در ویرایش 5 زبان PHP جهت بررسی اینکه آیا پارامتر ارسالی به تابع از نوع مورد نظر همچون عدد صحیح، بولی یا رشته است، توسعه دهنده می بایست به توابعی که با “is_” شروع می شوند متوسل شود. برای مثال:

  • تابع is_bool – با فراخوانی این تابع می توان بررسی کرد آیا متغیر مورد نظر از نوع بولی (true یا false) هست یا خیر.
  • is_int – با استفاده از این تابع توسعه دهنده می تواند مطمئن شود آیا متغیری از نوع عدد صحیح است یا خیر.
  • is_float – با فراخوانی تابع می توان پی برد آیا آرگومان ارسالی (متغیر) از نوع float (3.14، 1.2e3 یا 3E-10) هست یا خیر.
  • is_null – با استفاده از این تابع می توان پی برد آیا متغیری دارای مقدار null هست یا خیر.
  • is_string- با استفاده از این تابع می توان بررسی کرد آیا مقدار متغیر از نوع رشته است یا خیر.

زبان PHP در ویرایش 7 خود قابلیت اعتبارسنجی نوع تک مقداری (scalar type hinting) را در اختیار برنامه نویس قرار داد. انواع داده ای پشتیبانی شده به شرح زیر می باشد:

  • integer
  • float
  • string
  • boolean

نمونه کد زیر تنها در ویرایش 7 زبان PHP قابلیت اجرا دارد.

class car {    protected $model;    protected $hasSunRoof;    protected $numberOfDoors;    protected $price;    // string type hinting    public function setModel(string $model)    {      $this->model = $model;    }    // boolean type hinting    public function setHasSunRoof(bool $value)    {      $this->hasSunRoof = $value;    }    // integer type hinting    public function setNumberOfDoors(int $value)    {      $this->numberOfDoors = $value;    }    // float type hinting    public function setPrice(float $value)    {      $this->price = $value;    }      {      

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

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