为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
有只小跳蛙 2019-03-07 23:07:25
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个赞

这不是重载,也并不是允许重载的意思。
手册上也说了 历史原因,所谓的历史原因:
就是Perljoin函数参数顺序和早期开发人员习惯的一些冲突

比如早期为了保证第二个参数是OPTIONAL就将函数设定为了如下方式,这样的好处是可以不传递第二参数,直接将数组连接起来。

implode(array $arr, string $glue = '');
implode(array $arr); //这样就可以达到不传递第二个参数

后来为了规范改成了Perljoin参数顺序:

join EXPR,LIST

也就是字符串参数在前,
但是在编程过程中,很大部分时间内都无需连接的字符串(第一个参数),

implode('', $arr);

如果传递一个空字符串,浪费机器性能,所以,就保留了历史写法。
这也是PHP唯一的可以乱写顺序的函数。

相比jQueryanimate的参数顺序,这算小巫见大巫了。

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);
}
/* }}} */
查看完整回答
反对 回复 2019-03-18
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

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

test('123')
输出 123

查看完整回答
反对 回复 2019-03-18
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

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

查看完整回答
反对 回复 2019-03-18
  • 3 回答
  • 0 关注
  • 496 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信