PHP Conference Japan 2024

func_num_args

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

func_num_args傳回傳遞給函式的引數數量

說明

func_num_args(): int

取得傳遞給函式的引數數量。

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

參數

此函式沒有參數。

傳回值

傳回傳遞給目前使用者自訂函式的引數數量。

錯誤/例外

如果從使用者自訂函式外部呼叫,則會產生警告。

範例

範例 #1 func_num_args() 範例

<?php
function foo()
{
echo
"Number of arguments: ", func_num_args(), PHP_EOL;
}

foo(1, 2, 3);
?>

以上範例會輸出:

Number of arguments: 3

注意事項

注意:

自 PHP 8.0.0 起,func_*() 系列函式旨在對具名引數大多保持透明,方法是將引數視為如同以位置方式傳遞,且遺漏的引數會以其預設值取代。此函式會忽略收集到的未知具名可變引數。收集到的未知具名引數只能透過可變參數存取。

參見

新增註釋

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

jared at ws-db dot com
19 年前
只是給任何感到疑惑的人一個註釋。這個函式不包含具有預設值的參數,除非您傳入一個值來覆寫預設參數值。不確定這樣說是否清楚,所以這裡有一個例子

<?php
function helloWorld($ArgA, $ArgB="HelloWorld!") {
return
func_num_args();
}

// 下列程式碼將回傳 1
$Returns1 = helloWorld("HelloWorld!");

// 下列程式碼將回傳 2
$Returns2 = helloWorld("HelloWorld!", "HowdyWorld!");
?>
Dennis Robinson from basnetworks dot net
15 年前
當您有一個可以接受任何資料類型的選用參數時,這個函式會派上用場,而且我相信這是唯一的解決方案。

例如:

<?php

// $data 可以是任何類型,包含 null
function my_function($name, $data = null)
{
if (
$data !== null)
{
// 處理 $data
// 如果你呼叫 my_function('something'),這段程式碼不會被執行
// 如果你呼叫 my_function('something', null),這段程式碼不會被執行
}
}

?>

上述函式的問題在於你永遠無法使用 null 作為 $data 的值。要解決這個問題,請像這樣使用 func_num_args()

<?php

// $data 可以是任何類型,包含 null
function my_function($name, $data = null)
{
if (
func_num_args() >= 2)
{
// 處理 $data
// 如果你呼叫 my_function('something'),這段程式碼不會被執行
// 如果你呼叫 my_function('something', null),這段程式碼會被執行
}
}

?>

這個解決方案有效,因為 func_num_args() 會回報函式被呼叫時實際傳入的參數數量。它不會考慮預設參數值的使用。
tongcheong77 at gmail dot com
7 年前
如果你使用的是 PHP 7 且 func_num_args 在你繼承的基底類別中,你可以使用「展開」運算子傳遞你的參數。

class Sql {

public function doGetWhere(...$args) {

$num_args = func_num_args();
$args_list = func_get_args();

echo '<pre>';
var_dump($args_list);
echo '<pre>';
}
}

class Member extends Sql {

public function getWhere(...$args) {

$this->doGetWhere(...$args);

}
}

$member = new Member();
$member->getWhere('first_name','last_name','userlevel','email','where','email','=',$sub_email);

不過,請注意,如果你在上面的「Member」類別中「new」一個「Sql」類別的實例,而不是繼承它,則不需要將參數作為變數傳遞。一點淺見。 -Bruce tong
luisguillermo dot quevedovelez at gmail dot com
12 年前
我定義了一個函式 function_name(){ ...} 作為 Drupal 的回呼函式。
我嘗試取得傳遞了多少個參數

我遇到一個錯誤,我的網站掛掉了

我用 func_get_args() 取代了 func_num_args(),我的網站就恢復了。

我的結論是,你不能在回呼函式中使用 func_num_args()。

希望這有幫助。
thalis at NOSPAMcs dot pitt dot edu
22 年前
func_get_args() 的概念是建構具有可變數量參數的函式,例如

<?php
function var_param_func(){
if(
func_num_args()==0){
//做某件事
}
if(
func_num_args()==1)
//做另一件事
//使用 func_get_args() 取得參數
}
}
?>
ashley at dcs dot warwick dot ac dot uk
22 年前
如果您想將參數完整地傳遞給另一個函式,請使用 func_get_args 和 call_user_func_array(注意:這個函式僅在較新版本的 PHP 中可用)。例如:

<?php
/* 輸出一個 HTML 標籤。這個函式接受不定數量的參數:
第一個參數應該是標籤的名稱,後面接著成對的
參數,描述鍵和值。值會以雙引號括起來輸出。 */
function printTag() {
$numArgs = func_num_args();
if (
$numArgs < 1) die("printTag 沒有收到任何參數");

echo
"<" . func_get_arg(0);
for (
$i = 1; $i < $numArgs; $i+=2) {
echo
" " . func_get_arg($i);
if (
$i+1 < $numArgs)
echo
"=\"" . func_get_arg($i+1) . "\"";
}
echo
">";

}

/* 輸出一個帶有換行符的 HTML 標籤 */
function printTagNL() {
$args = func_get_args();
call_user_func_array("printTag", $args);
echo
"\n";
}

printTagNL("input", "type", "hidden", "name", "SORTORDER", "value", $columnNo);
?>
To Top