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-blocking 代码片段)。通过这种编程方式,你拥有完整的函数。
-5
mw atto lanfear dotto com
19 年前
func_get_arg() 在 PHP 5.0.2 中似乎不允许作为函数参数本身在类构造函数中使用(奇怪!)。

<?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():不能用作函数参数,在 c:\Inetpub\wwwroot\phpwasrc\chapter10\xxx.php 中的第 23 行

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