把赋值运算符写在 if 判断里好吗?

2014-05-17 19:01:42 +08:00
 Jat001
太容易跟比较运算符搞混了,对 php 新手也不友好。

嗯,还是 @explon 一下吧~
6083 次点击
所在节点    PHP
30 条回复
bearcat001
2014-05-17 21:23:15 +08:00
C里为了避免把判断写成赋值,一般这样做
if (3 == a)
bearcat001
2014-05-17 21:27:22 +08:00
没写完就提交了...
编译器会报错的,PHP也一样
所以赋值用 $a = 3 ,判断反过来写 3 == $a
for4
2014-05-17 21:46:36 +08:00
这个要看是什么语言。
大部分语言是不建议这样写的。
for4
2014-05-17 21:47:11 +08:00
没看到TAG ,
PHP里面 不要这样写
ashitaka
2014-05-17 21:49:01 +08:00
第一种方法比较好 意图很明显 判断$a 的值是否为空
第二种意图混乱 你到底是判读$a 的值是否为空 还是$a的值是否为'foo'
虽然此处按 lz 的意思是前者
但是当代码给别的人看时 就要通过判断来推测原作者意图了
raincious
2014-05-17 21:57:14 +08:00
看习惯。两种代码没有区别,只是节省了行数。属于小Trick类型的语法。

个人倾向于如果$a接受的是函数返回值,那么无所谓了。但是如果接受的是变量set,那么上面的语法是没有意义的。

$a = 'foo'必然不是false,所以if里面的语法必然会被执行。所以简直不如就是

$a = 'foo';
echo $a;
Jat001
2014-05-17 22:14:11 +08:00
@raincious 上面的列子可能太简单了,再举一个:
if ($a = trim($_GET['foo']))
$a 接受的确实是函数返回值。
romotc
2014-05-17 22:16:34 +08:00
@Jat001 一般后面需要用到$a 才这样写,即完成判断,又完成赋值。
yukirock
2014-05-17 22:18:53 +08:00
既然是給 $a 賦值爲字符串常量,那麼爲什麼又要做一次 if 判斷呢?
這樣的代碼是不是重構可能更好?
zythum
2014-05-17 22:23:09 +08:00
@yukirock 她只是举个例子

如果这样的例子是不是更好

if ($param = $_GET['param']) {
//then use $param here.
}
jsonline
2014-05-17 22:24:30 +08:00
等你哪天遇到坑了就知道了。
jsonline
2014-05-17 22:25:47 +08:00
写代码最好的习惯是,每一行都 donot make me think.
raincious
2014-05-17 22:26:42 +08:00
@yukirock

对编译器来说基本山是一回事。但是多了一行,很多人感觉不爽,包括我。

@Jat001

还是看规范的问题。PHP的PSR2没有规定这样的内容,可以理解为它把这个交给了程序员自行组织。

如果你能制定规则的话,那么可以指定一个规则来约束程序员的写法。如果不能的话,可以这样改变自己的思维来适应:

你想要检查$_GET['foo']这个里面的值是不是设定,包括是空白,那么原先的写法事实上是

if (trim($_GET['foo'])) { // 外部变量请自行isset
$a = $_GET['foo'];
// TODO
}

然后你发现,这样浪费了一行,自然要想办法修改,那么就顺理成章的改成了
if ($a = trim($_GET['foo'])) {
// TODO: Use $a
}

个人感觉可读性差别不大,而且个人也没有因为这个出过错。可能只是对待刚刚入门的新人时应该注意下。
messense
2014-05-17 22:27:38 +08:00
最近看 APUE 里面其实很多赋值语句写在 if 里,不过一般是这样的:

int fd;
if ((fd = open("/dev/null", O_RDWR)) < 0) {
fprintf(stderr, "open error");
exit(1);
}
raincious
2014-05-17 22:28:41 +08:00
@raincious 哦,说错了:

- 你想要检查$_GET['foo']这个里面的值是不是设定,包括是空白,那么原先的写法事实上是
+ 你想要检查$_GET['foo']这个里面的值是不是非空,包括是空白,那么原先的写法事实上是
nicai000
2014-05-17 22:28:50 +08:00
极其讨厌楼主和一楼的写法
hhkbp2
2014-05-17 22:29:26 +08:00
不是太好,不过go...
Jat001
2014-05-17 22:32:49 +08:00
@raincious 我一般这样写
$a = trim($_GET['foo']);
if ($a) {
//do some thing
}
可公司的代码基本是这样写的
if ($a = trim($_GET['foo'])) {
//do some thing
}
因为我有强迫症,所以要发个帖子问问……

另外我也写 shell 脚本,在 shell 中,一个等号与两个等号是一样的,都是比较运算符。
explon
2014-05-17 22:36:48 +08:00
你的举例不对,公司大部分逻辑是这样子的,基本赋值的是一个数组,存在下面执行循环

if ($inbox_dialog = $this->model('message')->get_inbox_message($_GET['page'], get_setting('contents_per_page'), $this->user_id))
{

foreach ($inbox_dialog as $key => $val)
{
explon
2014-05-17 22:39:38 +08:00
@Jat001 90% 以上 if 赋值都是 model 返回来一个数组,没有你举例的那种情况存在

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/113009

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX