اگر با سری پست های اصلاح کد های پی اچ پی آشنایی ندارید و یا سایر قسمت ها را نخوانده اید از اینجا شروع کنید:
در این قسمت می خواهیم از تابع ()func_get_args که باز هم از توابع داخلی پی اچ پی هست استفاده کنیم و اینجا هم می تونید داکیومنت این تابع رو در سایت پی اچ پی ببینید.
همون جوری که در داکیومنت گفته شده این تابع می تونه ورودی های تابع ما رو به صورت آرایه در بیاره و ما می خواهیم ازش استفاده کنیم تا توابعی بنویسیم که استفاده از آنها خیلی راحت تر باشه.
فرض کنیم طبق تکه کد زیر ما یک تابعی داریم که به عنوان ورودی یک آرایه می گیرد و روی اون آرایه می چرخد و نتیجه ای رو برمی گردونه، خوب پس باید حتما به عنوان ورودی آرایه به اون پاس بدیم و در غیر این صورت خطایی رخ می دهد:
public function has($abilities) { foreach ($abilities as $ability) { if (! isset($this->abilities[$ability])) { return false; } } return true; }
خوب اگر الان به عنوان ورودی تابع یعنی abilities$، یک مقدار غیر آرایه ای بدهیم به خطا می خوریم، ۲ روش مرسوم برای جلوگیری از این خطا رو در کد زیر به ترتیب می بینیم و در آخر میریم سراغ روشی که میخواهیم با اون کد تمیز تری داشته باشیم.
روش اول استفاده از یک if در اول تابع و قبل از استفاده از ورودی هست:
public function has($abilities) { if (!is_array($abilities)) { throw new InvalidArgumentException("input type must be array."); } foreach ($abilities as $ability) { if (! isset($this->abilities[$ability])) { return false; } } return true; }
و روش دوم هم استفاده از ویژگی type hint در پی اچ پی:
public function has(Array $abilities) { foreach ($abilities as $ability) { if (! isset($this->abilities[$ability])) { return false; } } return true; }
اما بریم سراغ روشی که ما می خواهیم ازش استفاده کنیم و از ۲ روش قبلی خواناتر و تمیز تر و البتههه دارای ویژگی مثبتی هست.
ما می تونیم با استفاده از تابع ()func_get_args یک مرحله آزادی بیشتر برای استفاده از تابع خودمون به وجود بیاریم در ضمن اینکه مشکل به خطا خورد کد رو هم از بین می بریم:
public function has($ability) { //ورودی رو به صورت آرایه می گیریم func_get_args()اینجا اول نگاه میکنیم اگر ورودی تابع آرایه نبود از $abilities = is_array($ability) ? $ability : func_get_args(); foreach ($abilities as $ability) { if (! isset($this->abilities[$ability])) { return false; } } return true; }
خوب همان طور که متوجه شدید در اینجا این امکان رو به وجود آوردیم که حتی در صورتی که ورودی تابع آرایه نبود به جای اینکه مستقیم از ورودی استفاده کنیم ورودی رو از تابع func_get_args بگیریم که همواره آرایه ای از ورودی های تابع به ما برمی گرداند و بدون نگرانی دیگه foreach می زنیم روی اون.
پس حالا می شود به هر دو صورت زیر این تابع رو صدا زد:
has([1, 2, 3]); has(1);
لطفا نظرتون رو توی کامنت ها بنویسید تا این سری پست های اصلاح کد های پی اچ پی رو با هم دیگه کامل تر کنیم.
معرفی و مشاهده سایر پست های اصلاح کد های پی اچ پی
راستی لایک هم لطفااااااا یادتون نره :)