آرگومان های تابع در php
آرگومان ها بخش مهمی از مفهوم تابع در php را در بر می گیرند. اساسا توابع برای اینکه بتوانند کارآمدتر و جامع تر باشند، باید توانایی دریافت متغیرها را داشته باشند تا آن ها را پردازش کرده و خروجی متناسب با آن را برگردانند.
ساختار آرگومان ها در php
آرگومان ها را درون پرانتز و کنار نام تابع قرار می دهیم. (اصطلاحا به آن پاس دادن آرگومان به تابع گفته می شود)
اگر تعداد آرگومان ها از یک بیشتر بود، کافیست آنها را با کاما از هم جدا کنیم:
function foo($arg1, $arg2, ...) { echo "Test"; }
آرگومانهای مجاز برای پاس دادن به توابع
php انواع مختلفی از آرگومانها را پشتیبانی می کند تا توابع برای هر حالتی انعطاف داشته باشند.
در زیر لیست آنها را مشاهده می کنید:
- پاس دادن آرگومان با مقدار (pass by value). مقدار پیشفرض.
- پاس دادن با رفرنس (pass by refrence)
- آرگومان ها دارای مقدار پیشفرض (default argument values)
- آرگومان ها با طول نامشخص (Variable-length argument lists)
- آرگومان های نام گذاری شده (named argument)
پاس دادن مقدار آرایه به تابع
هم متغیرهای معمولی و هم آرایه ها را می توانیم به تابع پاس دهیم:
$x = [1, 2, 3]; function printArray($array) { return $array[0] . $array[1] . $array[2]; } echo printArray($x); //output: 123
trailing coma در php8
در php8، امکان قراردادن کاما پس از آخرین آرگومان نیز وجود دارد. در حالی که در ورژن های قبلی خطای سینتکس داریم.
هدف از trailing comma اینست که زمانی که تعداد آرگومان ها زیاد است، تک تک آنها را در یک خط قرار دهیم و برای خوانایی بهتر (و همجنین راحتی برای افزودن آرگومان های دیگر)، از کاما برای آخرین آرگومان نیز استفاده کنیم و مشکلی پیش نیاید. php این کاما را نادیده می گیرد.
function takes_many_args( $first_arg, $second_arg, $a_very_long_argument_name, $arg_with_default = 5, $again = 'a default string', // trailing comma ) { // ... }
پاس دادن رفرنس متغیر به تابع
آرگومان ها به صورت پیشفرض با مقدار پاس داده می شوند ولی همچنین می توانیم رفرنس متغیر را نیز به تابع پاس دهیم.
همانطور که قبلا در مقاله آشنایی با متغیرها در php بیان کردیم، پاس دادن رفرنس یک متغیر می تواند در کار با آرایه ها بسیار مفید باشد.
آپدیت کردن مقادیر آرایه ها یا حتی متغیرها با رفرنس، از تعریف کردن متغیرهای جدید جلوگیری می کند و باعث بهبود عملکرد حافظه و سرعت نرم افزار می شود:
$x = 1; function plus(&$val) { $val++; } plus($x); echo $x; //output: 2
دادن مقدار پیشفرض به آرگومان ها
اگر در هنگام تعریف تابع، برای آن آرگومان ست شده باشد، لازم است هنگام فراخوانی تابع، آن آرگومان ها نیز به تابع پاس داده شود:
function Biawp($project) { return $project; } echo Biawp('Wordpress'); //output: WordPress echo Biawp(); // Too few arguments to function Biawp()
خروجی تابع دوم، یک خطای مهلک خواهد بود که بیان می کند شما آرگومان های کمی به تابع پاس داده اید در حالی که تابع در هنگام اجرای دستوراتش به آن آرگومان نیاز دارد.
خوشبختانه می توانیم یک مقدار دیفالت به آرگومان ها دهیم، تا زمانی که آرگومان ها پاس داده نشدند، تابع از آن مقادیر پیشفرض استفاده نماید:
function Biawp($project='Wordpress') { return $project; } echo Biawp(); //output: WordPress
مشاهده می کنید با اینکه ما هیچ آرگومانی به تابع پاس ندادیم، ولی خطایی دریافت نشد و همچنین تابع از مقدار پیشفرض آرگومان استفاده نمود. به این آرگومان ها، آرگومان ها غیرضروری می گویند.
می توانیم از null و آرایه هم به عنوان مقدار پیشفرض آرگومان استفاده نماییم:
function Biawp($project=[1, 2]) { return $project[0].$project[1]; } echo Biawp(); //output: 12
نکته مهم: آرگومان های ضروری باید قبل از آرگومان های غیرضروری قرار گیرند وگرنه تابع در خوانش آرگومان ها دچار مشکل می شود و نمی تواند مقداری که نیاز دارد را بیابد، چون با پاس ندادن یک آرگومان غیر ضروری که قبل از آرگومان ضروری وجود دارد، ترتیب آرگومان ها بهم میخورد.
function sizeOutput($size = "14", $name) { return "$name, $size is BEST"; } echo sizeOutput("fered"); // Fatal Error: too few argument
در تابع بالا، آرگومان غیرضروری size قبل از آرگومان ضروری name قرار دارد و اشتباه است. چون اگر کاربر آرگومان اول را با توجه به اینکه ضروری نیست وارد نکند، صرفا آرگومان دوم را پاس می دهد و تابع در خوانش آن دچار مشکل می شود. درست اینست:
function sizeOutput($name, $size = "14") { return "$name, $size is BEST"; } echo sizeOutput("fered"); // Fatal Error: too few argument
آرگومان ها با طول متغیر یا Variable-length arguments
ممکن است تعداد آرگومان هایی که قرار است به تابع ارسال شود متغیر و نامشخص باشد. در اینصورت می توانیم از آرگومان token… استفاده نماییم:
function sum(...$numbers) { $acc = 0; foreach ($numbers as $n) { $acc += $n; } return $acc; } echo sum(1, 2, 3, 4);
php توکن ما را به عنوان آرایه می شناسد و می توانیم از foreach برای دسترسی به آرگومان ها استفاده نماییم.
می توانیم در کنار آرگومان توکن، از آرگومان های دیگر هم استفاده کنیم:
function sum($x, $y, ...$numbers) { $acc = 0; foreach ($numbers as $n) { $acc += $n; } return $acc; } echo sum(1, 2, 3, 4, 5); //output: 12
مشاهده می کنیم که php از آرگومان سوم به بعد را به عنوان مقادیر آرگومان توکن در نظر می گیرد.
آرگومان های نامگذاری شده یا named arguments
php8 برای رفع محدودیت ترتیب آرگومان ها، آرگومان های نامگذاری شده را تعریف کرده است. بدین صورت هر آرگومان مانند یک متغیر دارای نام می شوند و در هنگام فراخوانی تابع، کافیست نام آرگومان و مقدار آن را وارد کنیم، بدون آنکه ترتیب آنها برای ما مهم باشد.
function fullName( $name, $family ) { return $name . ' ' . $family; } echo fullName(family:'yousefi', name:'mohammd'); //output: mohammad yousefi
مشاهده می کنید که در هنگام فراخوانی تابع، با استفاده از نام آرگومان و بدون توجه به ترتیب آن ها هنگام اعلان تابع، می توانیم مقادیر آرگومان را به تابع پاس دهیم.