1
lincanbin 2015-10-11 01:28:16 +08:00 via Android
php 要是支持强类型与类型声明就更好了,那就可以当 C++写了。
|
2
squid157 2015-10-11 01:29:24 +08:00
我也奇怪他们怎么忍受的。我这某老项目,一个破函数,十几个参数, tnnd 。
下面那两个我也是吃惊。。原来 C#在 10 年才有的 |
4
lincanbin 2015-10-11 01:33:02 +08:00 via Android
@squid157 把这些参数按 key-value 打包成一个 array 传进去,函数内部就使用这些 array 的元素。
|
5
towser 2015-10-11 02:05:12 +08:00
某个特性如果真的那么重要,社区不会忽略群众呼声。
|
6
zhengkai 2015-10-11 02:08:19 +08:00 6
也就多个方括号的事情,在 PHP 里你可以先这么凑合
Foo::bar([ 'k1' => 'v1, 'k2' => 'v2', ]); 不是你对某种语言比较熟,就一定要那种语言有的特性在别的语言里也要有,更别说这种语法糖层次的东西,在这种不足道的事情上钻牛角尖,只能停留在用 PHP 写 Java 或者用 PHP 写 C# 歪路上 每种语言都有自己的目的,适用的范围 你们通常管跑到西餐馆去问服务员“你们这么大的饭店怎么连饺子都没有”的人叫什么? |
9
jaguar 2015-10-11 08:56:27 +08:00
就像 v2 一样,简单就是美,为啥 php 一直世界上血统最高贵的语言,就是因为它的简单纯粹
|
10
dai269619118 2015-10-11 09:12:56 +08:00
@eoo 早就支持命名空间了 - -
|
11
dai269619118 2015-10-11 09:15:18 +08:00
@eoo 我看错 当我没说
|
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]); ``` |
14
liujiangbei 2015-10-11 10:26:27 +08:00
这个不是支持了嘛?
|
15
spacewander 2015-10-11 10:44:57 +08:00
不支持命名参数的语言才是大多数吧?
静态语言就构造出一个类,传进去;动态语言就构造出一个 KV 对。 习惯了就好。 |
16
k9982874 2015-10-11 10:51:36 +08:00 via iPad
个人觉得命名参数才是异类,调个函数还得说明参数是谁的,脱裤子放屁,从左到右顺序传不行么?
|
17
halfcoder 2015-10-11 11:07:06 +08:00
“ C++ 貌似还不支持命名参数?好奇 Cpper 们真的不关心这个特性吗?"
另外吐槽一下什么叫“现在都 7 了”, 5.6 下个版本就是 7 了好么…… |
18
zhs227 2015-10-11 12:00:35 +08:00
因为 PHP 有个万能的数组,所以传入一个数组慢慢取就可以了。
不同的语言有不同的惯用法,这也是经常让穿梭于各种语言中的人感到困惑的地方,最好的办法就是多看别人写的代码。 |
19
neutrino 2015-10-11 12:48:09 +08:00
有 IDE 提示参数,不用这个功能。。
|
20
fzinfz OP @lincanbin @zhengkai @spacewander @zhs227 @jhdxr
感谢各位指教~ 我是编程小白,没有想到原来大家都用 array 。。。因为曾经用过一份记得好像蛮出名的开源代码结果某个函数里有十几个参数,而我只需要改变其中的第十几个参数的值而已,从此对 php 有了心理阴影。。。 不过个人还是很喜欢这项特性,毕竟用 array/class 的话要知道 array key/class member 的名字又多了一层。。。 @halfcoder c/cpp 作为效率第一的语音,牺牲便利性表示很正常 才知道 5.6 的后续版本是 7 。。。一般只用到入门级的 PHP ,上个月看 php 到 7 了吓了一跳。。。无知了>.< |
21
iyaozhen 2015-10-11 14:59:34 +08:00
以前还没注意过, Python 中有时会这样用。
其实个人感觉适用范围比较小,因为函数的有些参数是必须要传的,默认参数的话往后面放,只是有些时候需要更改某个默认参数的话代码写的不够优雅。不过好多框架传参是用数组的。 其实这个特性还是蛮好用的。 |
23
viko16 2015-10-11 15:32:27 +08:00
养成“常用参数排前面”的好习惯就好
|
24
shiny 2015-10-11 15:51:39 +08:00
Bad Code Smells 里谈到过一种坏味道: Long Parameter List
如果觉得参数列表太长不好改,那说明你需要重构你的程序了,而不是依靠语法新特性。 |
25
shiny 2015-10-11 15:52:27 +08:00
如果只是为了参数更直观、可读性更好考虑,这种特性还是很不错的。
|
26
fzinfz OP @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. |
27
skydiver 2015-10-11 16:16:49 +08:00
生产一个参数对象,传对象进去。
参数太多本身就是有问题 |
28
grzhan 2015-10-11 17:51:27 +08:00
只是有些框架的函数参数设计不是特别好,因此如果这时候可以用命名参数还是比较方便的……
|
30
halfcoder 2015-10-11 22:51:57 +08:00 1
@fzinfz C++是编译型语言,只要编译器做得好,命名参数并不是问题。
其实早就有人提过给 C++加入的命名参数的提案,但是没有通过: 1.在函数声明中的每个参数都必须采用与函数定义中一样的名称 2.一旦使用了关键词参数,在函数定义中的参数名称就不能再改了,否则就会打破用户代码。 这是在《 C++语言的设计与演化》中提到的,强烈推荐这本书,我完全有理由认为每一个程序员都应该读这本书。 |
31
semicircle21 2015-10-12 09:17:19 +08:00
OC 在一旁默默不语....
|
32
heiyou 2015-10-12 10:47:53 +08:00
一般我写函数,最多 4 个参数。多了感觉别扭,需要重构下。实在没办法, key , value 的方式就是常用的解决方法了。
|
33
akstrom 2015-10-12 12:09:55 +08:00
一直在用数组传参,除非是一些很特殊的才会独立开来
|
34
fengyqf 2015-10-12 14:36:01 +08:00
参数多的话,用关联数据传参吧,虽然有点蛋疼。
即使新版本的支持,也要等 N 年以后才广泛应用 |