PHP 大会日本 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 个注释

8
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));
?>
1
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'
0
mightye (at) mightye (dot) org
20 年前
据我所知,func_get_arg() 返回参数的 *副本*,没有办法检索可变数量参数的引用。

我的游戏 (http://lotgd.net) 中有一个模块系统,我希望能够向模块中的函数传递可变数量的参数,并在模块请求引用时按引用传递它们,但是您不能将可选参数作为引用接受,也不能检索可变数量参数的引用。看起来我的模块将不得不放弃接受按引用传递给其函数的参数的能力。
-3
anders at ingemann dot fakestuff dot de
20 年前
我实际上认为确实需要这样的“万能”函数。我主要将它们用作快速原型设计的工具。
并且有一种方法可以将多个字符串传递给函数:ereg();
此类函数的另一个用途是为其他用户创建小的代码片段。如果他们不使用参数,则无需再编辑该函数。在调用函数时,他们只需不命名它即可。
这会导致功能非常强大的多功能函数。通常您只需要一小段代码(例如 IP 阻止代码片段)。通过这种类型的编程,您拥有完整的函数。
-5
mw atto lanfear dotto com
19 年前
在 PHP 5.0.2 中,func_get_arg() 似乎不允许在类构造函数中用作函数参数本身(奇怪!)。

<?php

class ABC
{
function
__construct()
{
foreach (
func_get_args() as $name => $value)
{
echo <<<EOT
<br/>
$name : $value <br/>
<br/>

EOT;
}
}
}

class
DEF extends ABC
{
function
__construct()
{
parent::__construct(func_get_arg(0),
func_get_arg(1),
func_get_arg(2));
}
}

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

?>

上述脚本生成

致命错误:func_get_arg(): 不能用作函数参数 in c:\Inetpub\wwwroot\phpwasrc\chapter10\xxx.php on line 23

但是,将这些作为参数传递给常规函数时没有问题。
To Top