PHP Conference Japan 2024

func_get_arg

(PHP 4, PHP 5, PHP 7, PHP 8)

func_get_arg從引數列表回傳項目

說明

func_get_arg(int $position): mixed

從使用者自訂函式的引數列表取得指定的引數。

此函數可以與 func_get_args()func_num_args() 搭配使用,允許使用者自訂函數接受可變長度的參數列表。

參數

position

參數的偏移量。函數參數從零開始計數。

回傳值

返回指定的參數,如果發生錯誤則返回 false

錯誤/例外

如果從使用者自訂函數外部呼叫,或者 position 大於實際傳遞的參數數量,則會產生警告。

範例

範例 #1 func_get_arg() 範例

<?php
function foo()
{
$numargs = func_num_args();
echo
"參數數量: $numargs\n";
if (
$numargs >= 2) {
echo
"第二個參數是: " . func_get_arg(1) . "\n";
}
}

foo(1, 2, 3);
?>

上述範例將輸出

Number of arguments: 3
Second argument is: 2

範例 #2 func_get_arg() 參數傳值和傳址的範例

<?php
function byVal($arg) {
echo
'傳入值 : ', var_export(func_get_arg(0)), PHP_EOL;
$arg = 'baz';
echo
'變更後 : ', var_export(func_get_arg(0)), PHP_EOL;
}

function
byRef(&$arg) {
echo
'傳入值 : ', var_export(func_get_arg(0)), PHP_EOL;
$arg = 'baz';
echo
'變更後 : ', var_export(func_get_arg(0)), PHP_EOL;
}

$arg = 'bar';
byVal($arg);
byRef($arg);
?>

上述範例將輸出


傳入值 : 'bar'
變更後 : 'baz'
傳入值 : 'bar'
變更後 : 'baz'

注意事項

說明:

自 PHP 8.0.0 起,func_*() 系列函式旨在對具名引數大部分透明,方法是將引數視為按位置傳遞,並以預設值取代缺少的引數。此函式會忽略未知具名可變引數的集合。只能透過可變參數存取收集到的未知具名引數。

說明:

如果引數是透過引用傳遞的,則對引數的任何更改都會反映在此函式返回的值中。從 PHP 7 開始,如果引數是透過值傳遞的,也會返回目前的值。

注意此函式僅返回傳遞引數的副本,並且不考慮預設(未傳遞)引數。

參見

新增註釋

使用者貢獻的註釋 5 則註釋

beta3designs [at] gmail [dot] com
15 年前
這個函式看起來功能很強大... 我一看到它就想到要寫一個快速計算 n 個數字平均值的函式,所以就有了這個,它非常簡單... 包含了使用範例。

<?php

//計算給定數字的平均值

function avg(){
$sum = 0;
for(
$i = 0; $i < func_num_args(); $i++){
$sum += func_get_arg($i);
}
$avg = $sum / func_num_args();
return
$avg;
}

echo
sprintf("%.2f",avg(2,1,2,1,3,4,5,1,3,6));
?>
gordon at abetz-rouse dot com dot au
4 年前
這個函式在 PHP5 和 PHP7 中的行為可能不同,在後者中,它似乎會參考變數,而在 PHP5 中,它會返回原始參數。
我已經用以下版本確認過,但这需要进一步确认这是否是 5 和 7 版本之间的差异。

function test( $test ){

$test = '123';

echo func_get_arg(0);

}

test( '321' );

//在 PHP 5.5.9 中,這個程式碼會輸出 '321'
//在 PHP 7.0.33 中,這個程式碼會輸出 '123'
mightye (at) mightye (dot) org
20 年前
據我所知,`func_get_arg()` 會返回參數的*副本*,沒有辦法取得不定數量參數的參考。

在我的遊戲 http://lotgd.net 中有一個模組系統,我希望能夠將不定數量的參數傳遞給模組中的函式,如果模組要求通過引用傳遞,則通過引用傳遞,但您不能接受可選參數作為引用,也不能在不定數量的參數上取得引用。 看起來我的模組將不得不放棄接受函式參數引用的能力。
anders at ingemann dot fakestuff dot de
20 年前
我認為確實需要這種「無所不能」的函式。我主要將它們用作快速原型設計的工具。
還有一種方法可以將多個字串傳遞給函式:`ereg()`;
這種函式的另一個用途是為其他人建立小的程式碼片段。如果他們不使用某個參數,他們就不必再編輯函式。他們在呼叫函式時只是不命名它。
這會產生用途非常廣泛的全能函式。通常,您只有一個小的程式碼片段(例如,IP 封鎖片段)。通過這種程式設計方式,您可以擁有完整的函式。
mw atto lanfear dotto com
19 年前
在 PHP 5.0.2 中,`func_get_arg()` 似乎不允許在類建構函式中用作函式參數(真是怪異!!!)

<?php

類別 ABC
{
函式
__construct()
{
foreach (
func_get_args() as $name => $value)
{
echo <<<EOT
<br/>
$name : $value <br/>
<br/>

EOT;
}
}
}

類別
DEF 延伸 ABC
{
函式
__construct()
{
parent::__construct(func_get_arg(0),
func_get_arg(1),
func_get_arg(2));
}
}

$def = new DEF(123123, "asdfasdf", "blahblahblah");

?>

上述程式碼會產生

致命錯誤:func_get_arg():無法作為函式參數使用,位於 c:\Inetpub\wwwroot\phpwasrc\chapter10\xxx.php 的第 23 行

然而,將這些作為參數傳遞給一般函式時沒有問題。
To Top