使用';func#u get#u arg';在PHP中?
我刚刚发现PHP中有一个名为使用';func#u get#u arg';在PHP中?,php,Php,我刚刚发现PHP中有一个名为func\u get\u arg的函数,它使开发人员能够使用不同的获取参数的方式。 它似乎非常有用,因为参数的数量现在可以是任意的,但我想不出任何使用它的好例子 使用此函数充分利用其多态特性的示例有哪些?我通常使用func\u get\u args(),如果需要多个参数,它更容易使用 例如,要重新创建PHP的max() 现在你可以做echo max(1,5,7,3)和get7我几乎不使用func\u get\u arg(),但我确实经常使用它的表亲func\u ge
func\u get\u arg
的函数,它使开发人员能够使用不同的获取参数的方式。
它似乎非常有用,因为参数的数量现在可以是任意的,但我想不出任何使用它的好例子
使用此函数充分利用其多态特性的示例有哪些?我通常使用
func\u get\u args()
,如果需要多个参数,它更容易使用
例如,要重新创建PHP的max()
现在你可以做
echo max(1,5,7,3)
和get7
我几乎不使用func\u get\u arg()
,但我确实经常使用它的表亲func\u get\u args()
。下面是一个示例,一个函数沿着echo
语句的行,实体对其所有参数进行编码:
function ee() {
$args = func_get_args();
echo implode('', array_map('htmlentities', $args));
}
我经常使用这个函数
下面是另一个有用的示例,该函数与SQL的COALESCE()
函数的作用相同
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!is_null($arg)) {
return $arg;
}
}
return null;
}
它返回传入的第一个非null参数,如果没有这样的参数,则返回
null
。我个人认为,在普通函数中,它没有好的使用案例。作为一个控制狂,我喜欢确切地知道传递给函数的是什么,也喜欢确切地知道传递的是什么
但是,它可以完全用于动态/静态URL路由之类的事情。当您正在重写(通过mod_rewrite)URL参数时,URL参数将变为单个引导
从这个意义上讲,您可以拥有不一定需要存在于每个页面请求中的参数 首先,您使用的术语“多态性”是完全错误的。多态性是面向对象编程中的一个概念,它与函数中变量数量无关 根据我的经验,
func\u get\u args
只允许您添加一点语法糖
考虑一个函数,它可以接受任意数量的整数并返回它们的和。(我在作弊,因为这已经存在于array\u sum
中了。但是如果作弊能保持示例的简单性,那么作弊是好的)。你可以这样做:
// you can leave "array" out; I have it because we should be getting one here
function sum1(array $integers) {
return array_sum($integers);
}
现在你可以这样称呼它:
$sum = sum1(array(1));
$sum = sum1(array(1, 2, 3, 4));
这不是很漂亮。但我们可以做得更好:
function sum2() {
$integers = func_get_args();
return array_sum($integers);
}
现在你可以这样称呼它:
$sum = sum2(1);
$sum = sum2(1, 2, 3, 4);
假设我们有多个包含数据的数组,在这些数组中我们需要在键之间搜索它们的值,而不合并这些数组 阵列如下所示:
$a = array('a' => 5, 'b' => 6);
$b = array('a' => 2, 'b' => 8);
$c = array('a' => 7, 'b' => 3);
在这种情况下,假设我们需要从所有数组中获取键a
的所有值。我们可以编写一个函数,它接受任意数量的数组进行搜索
// we need the key, and at least 1 array to search in
function simpleSearchArrays($key, $a1){
$arrays = func_get_args();
array_shift($arrays); // remove the first argument, which is the key
$ret = array();
foreach($arrays as $a){
if(array_key_exists($key, $a)){
$ret[] = $a[$key];
}
}
return $ret;
}
因此,如果我们使用该函数:
$x = simpleSearchArrays('a', $a, $b, $c);
$x
将包含数组(5,2,7)
获取函数参数列表的数组
此函数可与func\u get\u arg()
和func\u num\u args()
结合使用,以允许用户定义的函数接受可变长度参数列表
<?php
function foo()
{
$numargs = func_num_args();
echo "Number of arguments: $numargs \n";
if ($numargs >= 2) {
echo "Second argument is: " . func_get_arg(1) . "\n";
}
$arg_list = func_get_args();
for ($i = 0; $i < $numargs; $i++) {
echo "Argument $i is: " . $arg_list[$i] . "\n";
}
}
foo(1, 2, 3);
?>
从php5.6开始,不再有
func\u get\u arg的用例;这并不是说不再需要它的功能,而是使用…
语法替换它:
/**
* @param array $arguments
*/
public function poit(...$arguments)
{
foreach($arguments as $argument) {
...
}
}
如果有一些方法在最后被重载,这尤其有用;我们确实需要过滤掉第一个参数,如下所示:
使用func\u get\u arg
的旧样式:
function foo($a, $b) {
$c = array();
if (func_num_args() > 2) {
for($i = 0; $i < func_num_args()-2; $i++) {
$c[] = func_get_arg($i+2);
}
}
var_dump($a, $b, $c)
// Do something
}
foo('a', 'b', 'c', 'd');
两个foo都产生相同的输出,其中一个更易于编写。向下滚动到示例
,然后阅读用户提供的注释
sprintf
和max
都是可以处理任意数量参数的函数的好例子。通常,您希望将其用于统一类型的参数。您的意思不是“多态性”:您要查找的术语是“可变的”:toinfrade()
。习惯的力量-我从PHP4.0出现后不久就开始用PHP编写代码。您知道,如果您不介意这个双关语的话,您可以将其简化为array\u reduce(func\u get\u args(),max')
,它也适用于负数。@Keith也许我应该用这个初始数字-PHP\u INT\u max
。唯一的问题是如果没有参数,答案是-PHP\u INT\u max
array\u reduce($a,'max')
即使对于空数组也有效,在这种情况下,它将返回null
。我们有点离题了。:-)@Keith如果这样做,我不妨直接使用PHP的max()是的,我还不完全清楚-我的max()
是一个双参数函数,其行为类似于内置的max()
对两个参数的行为。应该更准确些。
function foo($a, $b) {
$c = array();
if (func_num_args() > 2) {
for($i = 0; $i < func_num_args()-2; $i++) {
$c[] = func_get_arg($i+2);
}
}
var_dump($a, $b, $c)
// Do something
}
foo('a', 'b', 'c', 'd');
function foo($a, $b, …$c) {
var_dump($a, $b, $c);
// Do something
}
foo('a', 'b', 'c', 'd');