PHP 拼接字符串… 哪个更好呢…

13次阅读

咳… 最近写的部分代码是有 Code Review 的 …
但是嘛… 我不知道哪种能过…

PS: PHP 版本是 5.4 的所以不要纠结 [] 是什么了 … 这就是 array

// 1
$rule = [
	'pid=etfscreener&formsubmit=1&etfpage=1&cn=cnUS&cf=&go=&ta=&er=er1&ry=&r1=&r3=&r5=&tac=1&erc=1&ryc=1&r5c=1',
	'pid=etfscreener&formsubmit=1&etfpage=1&cn=cnUS&cf=&go=&ta=&er=er2&ry=&r1=&r3=&r5=&tac=1&erc=1&ryc=1&r5c=1',
	'pid=etfscreener&formsubmit=1&etfpage=1&cn=cnUS&cf=&go=&ta=&er=er3&ry=&r1=&r3=&r5=&tac=1&erc=1&ryc=1&r5c=1',
	'pid=etfscreener&formsubmit=1&etfpage=1&cn=cnUS&cf=&go=&ta=&er=er4&ry=&r1=&r3=&r5=&tac=1&erc=1&ryc=1&r5c=1',
	'pid=etfscreener&formsubmit=1&etfpage=1&cn=cnUS&cf=&go=&ta=&er=er5&ry=&r1=&r3=&r5=&tac=1&erc=1&ryc=1&r5c=1',
];

// 2
$rule = array_map(function($s) {
	return "pid=etfscreener&formsubmit=1&etfpage=1&cn=cnUS&cf=&go=&ta=&er=er{$s}&ry=&r1=&r3=&r5=&tac=1&erc=1&ryc=1&r5c=1";
}, range(1, 5));

// 3
$rule = [];

for ($i = 1; $i < 6; $i++) { 
	$rule[] = "pid=etfscreener&formsubmit=1&etfpage=1&cn=cnUS&cf=&go=&ta=&er=er{$i}&ry=&r1=&r3=&r5=&tac=1&erc=1&ryc=1&r5c=1";
}

Aveline_Swan

你个死小兔你也有被人 code review 的时候啊 …

这三种写法 … 如果是成品代码 … 第一种是绝对不可取的 …

你知道你是复制粘贴然后只修改了一个数字 … 但 review 的人不知道 …

就算他知道 … 他也无法确定你是不是手滑多改动了什么 …

在无法确定你这五行代码是不是只有一个数字不一样其他都一样的情况下 …

他需要认真去看或者借助工具来确认这一点 … 这实际上是在给 reviewer 添不必要的麻烦 …

如果是 code-generator 或者 pre-processor 生成的代码 … 无疑第一种是效率最高的 …

但如果手写这种代码 … 哪怕只是 yy4p 也绝对是一个愚蠢的行为 …

再说剩下的 … 在这样一个简单的需求下 … 第二种的写法偏向炫技 … 第三种比较中规中矩 …

我稍微测了一下 … 第二种写法比第三种慢 140% …

换言之 … 第二种写法的执行效率是第三种写法的 240% …

数字看起来很可怕 … 但实际上都是毫秒级的差距 …

我们姑且不说在重负载高并发的情况下这几毫秒能影响什么 …

我只说浪费的这几毫秒 … 从任何角度讲 … 都完全没有意义 … 你听到服务器的哭泣了吗 ..?

有个事情我必须要说 … 并不是说你写成第三种样子就说明你没有能力 … 你的代码就不好看了 …

重剑无锋 … 大巧不工 …

举重若轻才是一个高手该有的样子 … 像你这种为了炫技而故意制造麻烦的做法 … 实在是不可取 …

当然 … 这只是说要把代码上线去跑的时候 … 社区沟通的话其实第二种和第三种区别真的不大 …

顺带一提 …

<?php
foreach( range( 1, 5 ) as $i )
    $rule[] = "pid=etfscreener&formsubmit=1&etfpage=1&cn=cnUS&cf=&go=&ta=&er=er{$i}&ry=&r1=&r3=&r5=&tac=1&erc=1&ryc=1&r5c=1";

这种类 python 的写法都比你用 array_map 要快哦 …

Sunyanzi

方案3

1.代码多,要看到差异部分太难了
2. 2 和 3 一般人都会写3. 2还有一个不好之处就是 range 先建立了一个数组,要不然array_map是更好的。
3. 选择3 我个人原因是因为直观

罗音

如果是重复的字符串,明显是 str_repeat() 更好。
如果不重复那么明显是第一种更好,因为在编译期间就已经确定了。
第二种是最慢的 函数式编程这一块在PHP这边还很弱 Python的写法不一定适用(当然我是做过测试的)
第三种属于中规中矩

qpwoeiru96

3是扩展性比较好吧.以后想加入新的变量或者增加循环次数的时候很方便
如果遇到了运行效率问题的话也可以很简单的渲染成第一种方式(写入文件或者echo啥的):

for ($i = 1; $i < 6; $i++) { 
    file_put_content("pid=etfscreener&formsubmit=1&etfpage=1&cn=cnUS&cf=&go=&ta=&er=er{$i}&ry=&r1=&r3=&r5=&tac=1&erc=1&ryc=1&r5c=1");
}

tczzjin

正文完