می توانیم اطلاعات را با استفاده از فهرست ورودی ها برای توابع بفرستیم؛ ورودی ها فهرستی از عبارت ها هستند که با علامت ویرگول از یکدیگر جدا شده اند. در تابع ها، ورودی ها از سمت چپ به راست مورد بررسی قرار می گیرند.
در پی اچ پی می توان ورودی ها را به صورت با مقدار (حالت پیش فرض)، با مرجع و مقادیر ورودی پیش فرض استفاده کرد. فهرست های ورودی طول متغیر نیز پشتیبانی می شوند.
مثال اول: ارسال کردن آرایه ها به تابع
<?php
function takes_array($input)
{
echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}
?>
ارسال ورودی ها به صورت با مرجع (By reference)
به صورت پیش فرض، ورودی های تابع به صورت با مقدار (By value) معرفی می شوند (بنابراین اگر مقدار ورودی در داخل تابع تغییر کند، مقدار آن در خارج از تابع تغییر نخواهد کرد). برای اینکه به یک تابع اجازه دهیم آرگومان خود را تغییر دهد (در خارج از محیط تابع)، باید به صورت با مرجع تعریف شوند.
برای اینکه اجازه دهیم یک ورودی به صورت با مرجع تعریف شود، یک علامت & قبل از نام ورودی در هنگام تعریف تابع قرار می دهیم:
مثال دوم: ارسال ورودی های تابع به صورت با مرجع
<?php
function add_some_extra(&$string)
{
$string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo $str; // outputs 'This is a string, and something extra.'
?>
مقادیر پیش فرض برای ورودی های تابع
برای ورودی های اسکالر در داخل یک تابع، می توان به شیوه زبان C++ مقادیر پیش فرض تعریف کرد:
مثال سوم: استفاده از مقدار پیش فرض در ورودی های یک تابع
<?php
function makecoffee($type = "cappuccino")
{
return "Making a cup of $type.\n";
}
echo makecoffee();
echo makecoffee(null);
echo makecoffee("espresso");
?>
خروجی مثال بالا به این شکل خواهد بود:
Making a cup of cappuccino.
Making a cup of .
Making a cup of espresso.
پی اچ پی به شما این اجازه را می دهد که از آرایه ها و مقدار خاص NULL برای مقادیر پیش فرض ورودی های تابع استفاده کنید. مثال زیر را در نظر داشته باشید:
مثال چهارم: استفاده از مقادیر غیر اسکالر به عنوان مقدار پیش فرض در ورودی یک تابع
<?php
function makecoffee($types = array("cappuccino"), $coffeeMaker = NULL)
{
$device = is_null($coffeeMaker) ? "hands" : $coffeeMaker;
return "Making a cup of ".join(", ", $types)." with $device.\n";
}
echo makecoffee();
echo makecoffee(array("cappuccino", "lavazza"), "teapot");
?>
مقدار پیش فرض باید حتما یک عبارت ثابت باشد، و به عنوان مثال یک متغیر یا عضو کلاس یا فراخوانی یک تابع را نمی توان به عنوان مقدار پیش فرض برای ورودی یک تابع در نظر گرفت.
توجه داشته باشید هنگامی که از مقادیر پیش فرض برای ورودی های تابع استفاده می کنید، هر ورودی تابع که دارای مقدار پیش فرض است باید در قسمت سمت راست ورودی (هایی) باشد که مقدار پیش فرض ندارد؛ در غیر اینصورت، ممکن است خروجی به آن شکلی که شما انتظار دارید نباشد. به قطعه کد زیر توجه کنید:
مثال پنجم: استفاده نادرست از مقادیر پیش فرض ورودی های یک تابع
<?php
function makeyogurt($type = "acidophilus", $flavour)
{
return "Making a bowl of $type $flavour.\n";
}
echo makeyogurt("raspberry"); // won't work as expected
?>
خروجی مثال بالا:
Warning: Missing argument 2 in call to makeyogurt() in
/usr/local/etc/httpd/htdocs/phptest/functest.html on line 41
مثال ششم: استفاده صحیح از ورودی های پیش فرض برای یک تابع
<?php
function makeyogurt($flavour, $type = "acidophilus")
{
return "Making a bowl of $type $flavour.\n";
}
echo makeyogurt("raspberry"); // works as expected
?>
خروجی مثال بالا به این شکل خواهد بود:
Making a bowl of acidophilus raspberry.
نکته: در پی اچ پی 5، ورودی هایی که به صورت با مرجع تعریف می شوند نیز می توانند مقدار پیش فرض داشته باشند.
فهرست های ورودی طول متغیر(Variable-length)
پی اچ پی از فهرست های ورودی طول متغیر در توابع تعریف شده توسط کاربر پشتیبانی می کند. این کار با استفاده از نشانه … در پی اچ پی 5.6 به بعد انجام می شود. و در پی اچ پی 5.5 و قبل از آن با استفاده از تابع func_num_args() و func_get_arg() و func_get_args() این کار انجام می شود.
در نسخه 5.6 به بعد استفاده از ...
در پی اچ پی 5.6 و نسخه های بعد از آن، فهرست ورودی ها می تواند شامل علامت ... باشد که مشخص می کند تابع تعداد متغیر را به عنوان ورودی قبول می کند. به عنوان مثال می توان ورودی ها را به یک متغیر مشخص، به صورت آرایه معرفی کرد:
مثال هفتم: استفاده از علامت ... برای دسترسی به ورودی های متغیر
<?php
function sum(...$numbers) {
$acc = 0;
foreach ($numbers as $n) {
$acc += $n;
}
return $acc;
}
echo sum(1, 2, 3, 4);
?>
خروجی مثال بالا به این شکل خواهد بود:
10
همچنین می توانید از علامت ... در هنگام فراخوانی توابع استفاده کنید تا یک آرایه را باز کنید یا یک متغیر قابل عبور یا یک لیترال را به یک فهرست ورودی وارد نمایید:
مثال هشتم: استفاده از علامت ... برای آماده کردن ورودی ها
<?php
function add($a, $b) {
return $a + $b;
}
echo add(...[1, 2])."\n";
$a = [1, 2];
echo add(...$a);
?>
خروجی مثال بالا به این شکل خواهد بود:
3
3
شما می توانید ورودی های وابسته به موقعیت معمولی را قبل از علامت ... قرار دهید. در این حالت فقط ورودی های پشتی که با ورودی وابسته به موقعیت سازگار نیستند به آرایه ای که توسط ... ایجاد شده است اضافه می شوند.
همچنین می توان یک اشاره گر نوع را قبل از نشانه ... قرار داد. اگر این اشاره گر وجود داشته باشد، تمامی ورودی هایی که توسط علامت ... ضبط می شوند باید اشیاء کلاس نشانه گذاری شده باشند.
مثال نهم: ورودی های متغیر که نوع آنها مشخص شده است
<?php
function total_intervals($unit, DateInterval ...$intervals) {
$time = 0;
foreach ($intervals as $interval) {
$time += $interval->$unit;
}
return $time;
}
$a = new DateInterval('P1D');
$b = new DateInterval('P2D');
echo total_intervals('d', $a, $b).' days';
// This will fail, since null isn't a DateInterval object.
echo total_intervals('d', null);
?>
خروجی مثال بالا به این شکل خواهد بود:
3 days
Catchable fatal error: Argument 2 passed to total_intervals() must be an instance of DateInterval, null given, called in - on line 14 and defined in - on line 2
در آخر اینکه شما همچنین می توانید ورودی های متغیر را به صورت با مرجع با قرار دادن علامت & قبل از ... معرفی کنید.
نسخه های قدیمی پی اچ پی
هیچ ساختار دستوری ویژه ای برای اینکه اشاره کنیم یک تابع از نوع متغیر است: با این وجود برای دسترسی به ورودی های تابع باید از توابع func_num_args(), func_get_arg() و func_get_args() استفاده کنیم.
اولین مثال ذکر شده در بالا را که برای نسخه های 5.5 به پایین تر نوشته شده است می توان به این شکل بازنویسی کرد:
مثال دهم: دسترسی به ورودی های متغیر در نسخه 5.5 پی اچ پی و نسخه های پایین تر از آن
<?php
function sum() {
$acc = 0;
foreach (func_get_args() as $n) {
$acc += $n;
}
return $acc;
}
echo sum(1, 2, 3, 4);
?>
خروجی مثال بالا به این شکل خواهد بود:
10