我剛剛發現在PHP中有一個叫做func_get_arg
的函數,它使開發人員能夠使用不同的風格來獲取參數。 這似乎是非常有用的,因爲參數的數量現在可以是任意的,但我想不出任何使用它的好例子。在PHP中使用'func_get_arg'的好例子是什麼?
使用此函數充分利用其多態特性的一些示例是什麼?
我剛剛發現在PHP中有一個叫做func_get_arg
的函數,它使開發人員能夠使用不同的風格來獲取參數。 這似乎是非常有用的,因爲參數的數量現在可以是任意的,但我想不出任何使用它的好例子。在PHP中使用'func_get_arg'的好例子是什麼?
使用此函數充分利用其多態特性的一些示例是什麼?
我通常使用func_get_args()
,如果想要多個參數,更易於使用。
例如,重新創建PHP的max()
。
function max() {
$max = -PHP_INT_MAX;
foreach(func_get_args() as $arg) {
if ($arg > $max) {
$max = $arg;
}
}
return $max;
}
現在你可以做echo max(1,5,7,3)
並得到7
。
你知道,你可以減少,如果你會原諒雙關語,直到array_reduce(func_get_args(),'max')',它也可以與負數一起工作。 –
@Keith也許我應該讓這個初始數字爲'-PHP_INT_MAX'。 – alex
唯一的問題是,如果你沒有參數,答案是'-PHP_INT_MAX'。 'array_reduce($ a,'max')'即使對於一個空數組也是可行的,在這種情況下它會返回null。我們在這裏討論一些話題。:-) –
我幾乎沒有使用func_get_arg()
,但我確實使用它的堂兄func_get_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
如果沒有這樣的說法。
[你可以刪除第一個參數](http://codepad.org/Gil0Xi29)到'implode()'。 – alex
習慣的力量 - 自從PHP 4.0出現後不久,我一直在用PHP編寫代碼。 –
就我個人而言,我認爲在正常函數內部沒有好的用例。作爲一個控制怪胎,我想知道傳遞給我的函數到底是什麼,我想知道我正在傳遞什麼。
但是,它可以用於動態/靜態URL路由之類的東西。當你正在重寫(通過mod_rewrite)時,URL會被引用到一個引導程序中。
從這個意義上說,您可以擁有不一定需要每個頁面請求都存在的參數。
首先,您使用的術語「多態性」完全錯誤。多態性是面向對象編程中的一個概念,它與函數中可變數量的參數無關。
根據我的經驗,所有func_get_args
可以讓你做的是添加一點句法糖。
想象一個函數可以接受任意數量的整數並返回它們的總和。 (我是作弊,因爲這已經存在於array_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
則包含array(5, 2, 7)
。
閱讀官方文檔,發現func_get_args()
:
獲取函數參數列表的數組。
該函數可與func_get_arg()
和func_num_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_get_arg
的用例;這並不是說,不需要它的功能了,但由variadic function使用...
語法代替:
/**
* @param array $arguments
*/
public function poit(...$arguments)
{
foreach($arguments as $argument) {
...
}
}
如果有在端重載方法,這是特別有用的;一個人需要再篩選出第一個參數,如展示由an example:
使用func_get_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');
較新的可變參數的風格;
function foo($a, $b, …$c) {
var_dump($a, $b, $c);
// Do something
}
foo('a', 'b', 'c', 'd');
這兩個foo產生相同的輸出,其中一個更容易編寫。
http://us2.php.net/manual/en/function.func-get-arg.php向下滾動到'Examples',然後閱讀'User Contributed Notes' – drudge
'sprintf'和'max'很好可以處理任意數量參數的函數示例。通常你想用統一類型的參數來使用它。 – mario
你不是指'多態':你正在尋找的術語是'variadic':http://en.wikipedia.org/wiki/Variadic_function –