با type hinting می توانیم نوع داده ورودی (آرایه, آبجکت, اینترفیس و..) آرگومان های تابع را مشخص کنیم.
این کار می تواند بسیار مفید باشد چرا که باعث سازماندهی بهتر کدها می شود و پیام های خطا را بهبود می بخشد.
در این سری از آموزش شی گرایی در PHP در مورد type hinting با تعریف آن در آرایه و آبجکت ها ورژن ۵ و ۷ php شروع می کنیم.
همچنین نوع داده های ساده ای مثل عددی,(integer) اعشاری,(double) رشته ها,(strings) بولین,(Boolean/true/false) که فقط درPHP 7 پشتیبانی می شود را یاد می گیرید.
اعتبارسنجی داده های ورودی (type hinting) در آرایه ها
اگر بخواهیم یک تابع را مجبور به دریافت آرگومان هایی از نوع آرایه (array) کنیم نیاز است از کلمه کلیدی array
قبل از نام آرگومان استفاده بهره ببریم:
1 2 3 4 |
function functionName (array $argumentName) { //code } |
در مثال زیر, تابع calcNumMilesOnFullTank()
میزان مسافتی که یک مدل خاص از خودرو می تواند با باک پر طی کند را بر اساس مایل برگشت می دهد.
این تابع فقط آرگومان از نوع آرایه را می پذیرد, که همانطور که می بینید با کلیدواژه array
مشخص کردیم:
1 2 3 4 5 6 7 8 9 10 11 |
// 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 "<br />"; } } |
ابتدا یک مقدار غیر از آرایه را به تابع پاس می دهیم تا نتیجه را ببینید:
1 |
calcNumMilesOnFullTank("Toyota"); |
error
Catchable fatal error: Argument 1 passed to calcNumMilesOnFullTank() must be of the type array, string given
این ارور نوشته که آرگومان اول تابع ما انتظار نوع داده آرایه را داشت ولی یک رشته پاس دادید.
1 2 3 4 5 6 |
$models = array( array('Toyota', 12, 44), array('BMW', 13, 41) ); calcNumMilesOnFullTank($models); |
نتیجه
Toyota : 528
BMW : 533
حالا کد خود را دوباره می نویسیم و اینبار آرایه را با آیتم هایی که نیاز است پاس می دهیم که شامل مدل ماشین, حجم باک و سوخت بر اساس مایل است.
چطور نوع داده ورودی را آبجکت تعیین کنیم؟
Type hinting می تواند تابع را مجبور به دریافت آرگومان از نوع آبجکت کند. برای همین, نام کلاس را قبل آرگومان قرار میدیم.
در مثال زیر سازنده کلاس (constructor
) فقط آبجکت های ساخته شده از کلاس Driver
را قبول می کند و این را با قرار دادن کلمه Driver
قبل از نام آرگومان در متد سازنده تصدیق می کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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 برای نوع داده های ساده پشتیبانی می کند؟
php 7 پشتیبانی می کند اما php 5 از مفهوم type hinting برای داده های ساده مثل عدد, اعشار, رشته ها و بولین ها پشتیبانی نمی کند
چون php 5 از اعتبارسنجی داده های وروردی مثل integers
, Booleans
, strings
پشتیبانی نمی کند می توانیم از خانواده توابع “is_
” استفاده کنیم:
is_bool
–تشخیص مقدار بولین (true یا false)is_int
–تشخیص مقدار عدد صحیحis_float
–تشخیص عدد اعشاریis_null
–تشخیص مقدار NULLis_string
–تشخیص رشته
ولی برای PHP7 به راحتی می توانید از مفهوم type hinting بصورت زیر استفاده کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
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; } } |
جمع بندی آموزش شی گرایی در PHP – اعتبارسنجی داده های ورودی type hinting
در این بخش از سری آموزش شی گرایی در PHP با موضوع type hinting به منظور اعتبارسنجی داده های ورودی توابع و متدها آشنا شدید
هر سوالی در مورد این بخش از آموزش داشتید حتما کامنت کنید خوشحال میشم به سوالات و مشکلات شما در مورد اعتبارسنجی داده در php کمک کنم
موفق و پیروز باشید