PHP是不许函数重载的,但为什么它有几个implode()函数?

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,"|"));
?>
有只小跳蛙
浏览 497回答 3
3回答

繁华开满天机

这不是重载,也并不是允许重载的意思。手册上也说了 历史原因,所谓的历史原因:就是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

function test(){ $args = func_get_args(); 在函数中可以得到传递的参数 echo $args[0]; } test('123')输出 123

肥皂起泡泡

你是从别的语言转过来的吧,大兄弟。如果你是一个PHPER,看到这个问题可能会一脸懵逼,PHP不是天然就是这样的么? 你脑子里的那一套是强类型语言的,不要直接套到PHP上面来。PHP是非常灵活的弱类型脚本语言,所以函数的写法跟强类型语言是不一样,好坏不讨论,见仁见智.
打开App,查看更多内容
随时随地看视频慕课网APP