V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fzinfz
V2EX  ›  PHP

PHP 貌似还不支持命名参数?好奇 PHPer 们真的不关心这个特性吗?

  •  
  •   fzinfz · 2015-10-11 01:24:27 +08:00 · 5427 次点击
    这是一个创建于 3117 天前的主题,其中的信息可能已经有所发展或是发生改变。
    https://wiki.php.net/rfc/named_params
    貌似 13 年才提出这个需求?
    Proposed for: PHP 5.6 可是现在都 7 了还 Under Discussion ?理由是"this is a very complicated feature I do not wish to spend time finishing it without knowing that we actually want this feature"...

    Python 在 06 年就实现了: https://www.python.org/dev/peps/pep-3102/
    C#也 10 年实现了: https://msdn.microsoft.com/en-us/library/dd264739.aspx
    34 条回复    2015-10-12 14:36:01 +08:00
    lincanbin
        1
    lincanbin  
       2015-10-11 01:28:16 +08:00 via Android
    php 要是支持强类型与类型声明就更好了,那就可以当 C++写了。
    squid157
        2
    squid157  
       2015-10-11 01:29:24 +08:00
    我也奇怪他们怎么忍受的。我这某老项目,一个破函数,十几个参数, tnnd 。

    下面那两个我也是吃惊。。原来 C#在 10 年才有的
    orFish
        3
    orFish  
       2015-10-11 01:30:39 +08:00
    @lincanbin 其实现在是支持的。。。就是有点奇怪
    lincanbin
        4
    lincanbin  
       2015-10-11 01:33:02 +08:00 via Android
    @squid157 把这些参数按 key-value 打包成一个 array 传进去,函数内部就使用这些 array 的元素。
    towser
        5
    towser  
       2015-10-11 02:05:12 +08:00
    某个特性如果真的那么重要,社区不会忽略群众呼声。
    zhengkai
        6
    zhengkai  
       2015-10-11 02:08:19 +08:00   ❤️ 6
    也就多个方括号的事情,在 PHP 里你可以先这么凑合

    Foo::bar([
    'k1' => 'v1,
    'k2' => 'v2',
    ]);

    不是你对某种语言比较熟,就一定要那种语言有的特性在别的语言里也要有,更别说这种语法糖层次的东西,在这种不足道的事情上钻牛角尖,只能停留在用 PHP 写 Java 或者用 PHP 写 C# 歪路上

    每种语言都有自己的目的,适用的范围

    你们通常管跑到西餐馆去问服务员“你们这么大的饭店怎么连饺子都没有”的人叫什么?
    chaegumi
        7
    chaegumi  
       2015-10-11 07:08:59 +08:00
    @zhengkai +10086
    eoo
        8
    eoo  
       2015-10-11 08:41:58 +08:00 via Android
    @lincanbin PHP7 已经支持了 再等等 不到一个月了
    jaguar
        9
    jaguar  
       2015-10-11 08:56:27 +08:00
    就像 v2 一样,简单就是美,为啥 php 一直世界上血统最高贵的语言,就是因为它的简单纯粹
    dai269619118
        10
    dai269619118  
       2015-10-11 09:12:56 +08:00
    @eoo 早就支持命名空间了 - -
    dai269619118
        11
    dai269619118  
       2015-10-11 09:15:18 +08:00
    @eoo 我看错 当我没说
    jhdxr
        12
    jhdxr  
       2015-10-11 09:57:12 +08:00
    一个函数参数太多我觉得本身这个函数就有问题。。。另外现在我觉得完全可以支持这个特性的,参考 6 楼的即可。
    ```
    function foo($a, $b, $c, $d) {
    if(func_num_args() === 1) {
    extract($a); //security problem? maybe filter first
    }
    }

    foo(1, 2, 3, 4);
    foo(['b'=>2,'a'=>1,'d'=>4,'c'=>3]);

    ```
    irgil
        13
    irgil  
       2015-10-11 10:13:57 +08:00
    @lincanbin php7 已支持
    liujiangbei
        14
    liujiangbei  
       2015-10-11 10:26:27 +08:00
    这个不是支持了嘛?
    spacewander
        15
    spacewander  
       2015-10-11 10:44:57 +08:00
    不支持命名参数的语言才是大多数吧?
    静态语言就构造出一个类,传进去;动态语言就构造出一个 KV 对。
    习惯了就好。
    k9982874
        16
    k9982874  
       2015-10-11 10:51:36 +08:00 via iPad
    个人觉得命名参数才是异类,调个函数还得说明参数是谁的,脱裤子放屁,从左到右顺序传不行么?
    halfcoder
        17
    halfcoder  
       2015-10-11 11:07:06 +08:00
    “ C++ 貌似还不支持命名参数?好奇 Cpper 们真的不关心这个特性吗?"

    另外吐槽一下什么叫“现在都 7 了”, 5.6 下个版本就是 7 了好么……
    zhs227
        18
    zhs227  
       2015-10-11 12:00:35 +08:00
    因为 PHP 有个万能的数组,所以传入一个数组慢慢取就可以了。

    不同的语言有不同的惯用法,这也是经常让穿梭于各种语言中的人感到困惑的地方,最好的办法就是多看别人写的代码。
    neutrino
        19
    neutrino  
       2015-10-11 12:48:09 +08:00
    有 IDE 提示参数,不用这个功能。。
    fzinfz
        20
    fzinfz  
    OP
       2015-10-11 13:47:57 +08:00
    @lincanbin @zhengkai @spacewander @zhs227 @jhdxr
    感谢各位指教~ 我是编程小白,没有想到原来大家都用 array 。。。因为曾经用过一份记得好像蛮出名的开源代码结果某个函数里有十几个参数,而我只需要改变其中的第十几个参数的值而已,从此对 php 有了心理阴影。。。
    不过个人还是很喜欢这项特性,毕竟用 array/class 的话要知道 array key/class member 的名字又多了一层。。。

    @halfcoder
    c/cpp 作为效率第一的语音,牺牲便利性表示很正常
    才知道 5.6 的后续版本是 7 。。。一般只用到入门级的 PHP ,上个月看 php 到 7 了吓了一跳。。。无知了>.<
    iyaozhen
        21
    iyaozhen  
       2015-10-11 14:59:34 +08:00
    以前还没注意过, Python 中有时会这样用。

    其实个人感觉适用范围比较小,因为函数的有些参数是必须要传的,默认参数的话往后面放,只是有些时候需要更改某个默认参数的话代码写的不够优雅。不过好多框架传参是用数组的。

    其实这个特性还是蛮好用的。
    icloudnet
        22
    icloudnet  
       2015-10-11 15:02:25 +08:00
    @jaguar 你够了, O(∩_∩)O 哈!
    viko16
        23
    viko16  
       2015-10-11 15:32:27 +08:00
    养成“常用参数排前面”的好习惯就好
    shiny
        24
    shiny  
       2015-10-11 15:51:39 +08:00
    Bad Code Smells 里谈到过一种坏味道: Long Parameter List
    如果觉得参数列表太长不好改,那说明你需要重构你的程序了,而不是依靠语法新特性。
    shiny
        25
    shiny  
       2015-10-11 15:52:27 +08:00
    如果只是为了参数更直观、可读性更好考虑,这种特性还是很不错的。
    fzinfz
        26
    fzinfz  
    OP
       2015-10-11 16:06:45 +08:00
    @shiny 主要是我用 PHP 一般都是调用或改现成的>.<

    借用一段 Q&A 回复这个问题吧,来源: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4172.htm

    Objection #1: This feature caters to having functions with many parameters - a programming style that should be discouraged.

    We agree that having functions with many parameters should be discouraged. However, the reality is that many legacy APIs that programmers have to work with and will have to work with for a long time, have functions with many arguments, and making it easier to deal with such functions would solve a real problem and be materially useful.

    More importantly, however, this feature has a lot of value for functions with few arguments, too. Even for functions with few arguments, when reading a call site one has relatively little information about the roles of the arguments. Having names of arguments present would make call sites more readable, regardless of the number of arguments.
    skydiver
        27
    skydiver  
       2015-10-11 16:16:49 +08:00
    生产一个参数对象,传对象进去。
    参数太多本身就是有问题
    grzhan
        28
    grzhan  
       2015-10-11 17:51:27 +08:00
    只是有些框架的函数参数设计不是特别好,因此如果这时候可以用命名参数还是比较方便的……
    squid157
        29
    squid157  
       2015-10-11 21:51:26 +08:00
    @fzinfz

    +1
    坑逼代码又不是我写的,出了问题看着快瞎了。
    halfcoder
        30
    halfcoder  
       2015-10-11 22:51:57 +08:00   ❤️ 1
    @fzinfz C++是编译型语言,只要编译器做得好,命名参数并不是问题。
    其实早就有人提过给 C++加入的命名参数的提案,但是没有通过:
    1.在函数声明中的每个参数都必须采用与函数定义中一样的名称
    2.一旦使用了关键词参数,在函数定义中的参数名称就不能再改了,否则就会打破用户代码。
    这是在《 C++语言的设计与演化》中提到的,强烈推荐这本书,我完全有理由认为每一个程序员都应该读这本书。
    semicircle21
        31
    semicircle21  
       2015-10-12 09:17:19 +08:00
    OC 在一旁默默不语....
    heiyou
        32
    heiyou  
       2015-10-12 10:47:53 +08:00
    一般我写函数,最多 4 个参数。多了感觉别扭,需要重构下。实在没办法, key , value 的方式就是常用的解决方法了。
    akstrom
        33
    akstrom  
       2015-10-12 12:09:55 +08:00
    一直在用数组传参,除非是一些很特殊的才会独立开来
    fengyqf
        34
    fengyqf  
       2015-10-12 14:36:01 +08:00
    参数多的话,用关联数据传参吧,虽然有点蛋疼。
    即使新版本的支持,也要等 N 年以后才广泛应用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3055 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 15:00 · PVG 23:00 · LAX 08:00 · JFK 11:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.