string implode(array $pieces)将一维数组$pieces的每个元素值转换为字符串并连接起来。string implode(string $glue, array $pieces)将一维数组$pieces的每个元素值转换为字符串并用$glue连接起来。string implode(array $pieces, string $glue="")将一维数组$pieces的每个元素值转换为字符串并用$glue连接起来。Note:implode()可以接收两种参数顺序,这是历史原因。实例一:
<?php
$test=["a","b","c"];
var_dump(implode($test));
?>
实例二:
<?php
$test=["a","b","c"];
var_dump(implode("|",$test));
?>
实例三:
<?php
$test=["a","b","c"];
var_dump(implode($test,"|"));
?>
3 回答
繁华开满天机
TA贡献1816条经验 获得超4个赞
这不是重载,也并不是允许重载的意思。
手册上也说了 历史原因,所谓的历史原因:
就是Perl
中join
函数参数顺序和早期开发人员习惯的一些冲突
比如早期为了保证第二个参数是OPTIONAL
就将函数设定为了如下方式,这样的好处是可以不传递第二参数,直接将数组连接起来。
implode(array $arr, string $glue = '');
implode(array $arr); //这样就可以达到不传递第二个参数
后来为了规范改成了Perl
的join
参数顺序:
join EXPR,LIST
也就是字符串参数在前,
但是在编程过程中,很大部分时间内都无需连接的字符串(第一个参数),
implode('', $arr);
如果传递一个空字符串,浪费机器性能,所以,就保留了历史写法。
这也是PHP唯一的可以乱写顺序的函数。
相比jQuery
的animate
的参数顺序,这算小巫见大巫了。
jQuery 的 animate 除了 第一个参数外,后面的顺序都可以如下方式,这已经叫够乱了。(它是通过参数类型区分的)
jQuery('#id').animate({left: 100}, function() {
//callback
});
jQuery('#id').animate({left: 100}, 3000, function() {
//callback
});
jQuery('#id').animate({left: 100}, 1500, 'linear', function() {
//callback
});
要说这个函数的实现,也只有一个C的实现,
「重载」方法并不复杂,就是判断arg的参数数量、类型,源码
下面PHP的C源码中,对于参数的顺序处理也并不复杂
/* {{{ 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();
//如果参数2是空 并且参数是 数组
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) { //参数1是数组
glue = zval_get_string(arg2);
pieces = arg1;
} else if (Z_TYPE_P(arg2) == IS_ARRAY) { //参数2是数组
glue = zval_get_string(arg1);
pieces = arg2;
} else { //报错
php_error_docref(NULL, E_WARNING, "Invalid arguments passed");
return;
}
}
php_implode(glue, pieces, return_value);
zend_string_release(glue);
}
/* }}} */
慕勒3428872
TA贡献1848条经验 获得超6个赞
function test(){
$args = func_get_args(); 在函数中可以得到传递的参数
echo $args[0];
}
test('123')
输出 123
肥皂起泡泡
TA贡献1829条经验 获得超6个赞
你是从别的语言转过来的吧,大兄弟。如果你是一个PHPER,看到这个问题可能会一脸懵逼,PHP不是天然就是这样的么? 你脑子里的那一套是强类型语言的,不要直接套到PHP上面来。PHP是非常灵活的弱类型脚本语言,所以函数的写法跟强类型语言是不一样,好坏不讨论,见仁见智.
- 3 回答
- 0 关注
- 496 浏览
添加回答
举报
0/150
提交
取消