3 回答

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超4個(gè)贊
這不是重載,也并不是允許重載的意思。
手冊(cè)上也說(shuō)了 歷史原因,所謂的歷史原因:
就是Perl
中join
函數(shù)參數(shù)順序和早期開(kāi)發(fā)人員習(xí)慣的一些沖突
比如早期為了保證第二個(gè)參數(shù)是OPTIONAL
就將函數(shù)設(shè)定為了如下方式,這樣的好處是可以不傳遞第二參數(shù),直接將數(shù)組連接起來(lái)。
implode(array $arr, string $glue = '');
implode(array $arr); //這樣就可以達(dá)到不傳遞第二個(gè)參數(shù)
后來(lái)為了規(guī)范改成了Perl
的join
參數(shù)順序:
join EXPR,LIST
也就是字符串參數(shù)在前,
但是在編程過(guò)程中,很大部分時(shí)間內(nèi)都無(wú)需連接的字符串(第一個(gè)參數(shù)),
implode('', $arr);
如果傳遞一個(gè)空字符串,浪費(fèi)機(jī)器性能,所以,就保留了歷史寫(xiě)法。
這也是PHP唯一的可以亂寫(xiě)順序的函數(shù)。
相比jQuery
的animate
的參數(shù)順序,這算小巫見(jiàn)大巫了。
jQuery 的 animate 除了 第一個(gè)參數(shù)外,后面的順序都可以如下方式,這已經(jīng)叫夠亂了。(它是通過(guò)參數(shù)類型區(qū)分的)
jQuery('#id').animate({left: 100}, function() {
//callback
});
jQuery('#id').animate({left: 100}, 3000, function() {
//callback
});
jQuery('#id').animate({left: 100}, 1500, 'linear', function() {
//callback
});
要說(shuō)這個(gè)函數(shù)的實(shí)現(xiàn),也只有一個(gè)C的實(shí)現(xiàn),
「重載」方法并不復(fù)雜,就是判斷arg的參數(shù)數(shù)量、類型,源碼
下面PHP的C源碼中,對(duì)于參數(shù)的順序處理也并不復(fù)雜
/* {{{ proto string implode([string glue,] array pieces)
Joins array elements placing glue string between items and return one string */
PHP_FUNCTION(implode)
{
zval *arg1, *arg2 = NULL, *pieces;
zend_string *glue;
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_ZVAL(arg1)
Z_PARAM_OPTIONAL
Z_PARAM_ZVAL(arg2)
ZEND_PARSE_PARAMETERS_END();
//如果參數(shù)2是空 并且參數(shù)是 數(shù)組
if (arg2 == NULL) {
if (Z_TYPE_P(arg1) != IS_ARRAY) {
php_error_docref(NULL, E_WARNING, "Argument must be an array");
return;
}
glue = ZSTR_EMPTY_ALLOC();
pieces = arg1;
} else {
if (Z_TYPE_P(arg1) == IS_ARRAY) { //參數(shù)1是數(shù)組
glue = zval_get_string(arg2);
pieces = arg1;
} else if (Z_TYPE_P(arg2) == IS_ARRAY) { //參數(shù)2是數(shù)組
glue = zval_get_string(arg1);
pieces = arg2;
} else { //報(bào)錯(cuò)
php_error_docref(NULL, E_WARNING, "Invalid arguments passed");
return;
}
}
php_implode(glue, pieces, return_value);
zend_string_release(glue);
}
/* }}} */

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個(gè)贊
function test(){
$args = func_get_args(); 在函數(shù)中可以得到傳遞的參數(shù)
echo $args[0];
}
test('123')
輸出 123

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個(gè)贊
你是從別的語(yǔ)言轉(zhuǎn)過(guò)來(lái)的吧,大兄弟。如果你是一個(gè)PHPER,看到這個(gè)問(wèn)題可能會(huì)一臉懵逼,PHP不是天然就是這樣的么? 你腦子里的那一套是強(qiáng)類型語(yǔ)言的,不要直接套到PHP上面來(lái)。PHP是非常靈活的弱類型腳本語(yǔ)言,所以函數(shù)的寫(xiě)法跟強(qiáng)類型語(yǔ)言是不一樣,好壞不討論,見(jiàn)仁見(jiàn)智.
- 3 回答
- 0 關(guān)注
- 528 瀏覽
添加回答
舉報(bào)