PHP 有没有必要进行变量声明?

2015-09-07 21:25:51 +08:00
 blue7wings
写代码的时候,总是习惯像其他语言一样实现声明下变量(给默认值),比如,我知道$age 是表示年龄的话,我就会:
```$age = 0;
```
好处:
1. 当没有给这个变量赋值,而返回这个变量时会有一个默认的值.
2. 条理更加清晰

坏处:
1. 变量多的时候,会导致有一长串的变量声明

不知道各位有没有这个习惯,怎么看?
4659 次点击
所在节点    PHP
22 条回复
shidenggui
2015-09-07 21:27:52 +08:00
不能链式赋值?
`$v1 = $v2 = $v3 = 0;`
bdbai
2015-09-07 21:27:59 +08:00
莫名其妙蹦个变量出来会很诡异。
raincious
2015-09-07 21:31:29 +08:00
你是说变量集体初始化操作?比如

$currentTime = $nextTime = $expireTime = 0;

这样的?

我原先也这么写,直到 PHPStorm 告诉我这样不对,因为有些变量会被直接覆盖,就像:

$currentTime = 0;

$currentTime = time ();

所以还是按需初始化比较好。
slayerdoomsday
2015-09-07 21:33:39 +08:00
个人觉得初始化变量应该是个好习惯吧,尤其是声明数组的时候。
blue7wings
2015-09-07 21:35:15 +08:00
@raincious 我也是这么认为...首先分开写美观点嘛..
kookxiang
2015-09-07 21:37:09 +08:00
不需要,因为变量有作用域。
声明变量主要是以前 register global 的时候才用的吧
konakona
2015-09-07 21:41:03 +08:00
类成员最好先声明,方法变量则按需声明,比如说:

function imafunc ($arr ){
$times = [];
foreach ($arr as $row ){
$times[] = $row['created_at'];
return $times;
}
}
只用一次的变量我会在用之前声明。

还有:

function imsolong (){
$times = [];
$peoples = [];
$activites = [];
...//大约 10 行代码,这里是一个逻辑块,所要用到的变量会在逻辑快之前先统一初始化,告诉别人我接下来要用到这些,我顺便可以在初始化的时候写上注释,告诉别人这是干什么的。

}
tabris17
2015-09-07 22:10:42 +08:00
是个好习惯,但是不是必须

因为 PHP 不像 Javascript ,有作用域链。

而且你可以认为每个变量的初始值是 null ,不确定是否初始化,则可以用 isset 来判断。
zts1993
2015-09-07 22:27:43 +08:00
严谨的说是要的,,但是既然准备图省事那就不用了。。
lzxgh621
2015-09-07 22:58:08 +08:00
Notice: Undefined index
jhdxr
2015-09-07 23:04:06 +08:00
不确定楼主所说的『变量声明』是指什么。
`$age = 0`在我看来做了两件事情:声明`$age`的存在,和对`$age`进行赋值为零。
如果你说的仅仅是前者,我认为是不必要的。只需要确保在使用一个变量前,一定对它进行过赋值即可。
实际上在*使用*未声明的变量的时候, php 同样会抛出一个 notice 。
例如,
```
<?php
echo $undefined_var;
```
>Notice: Undefined variable: undefined_var in R:\a.php on line 2
jhdxr
2015-09-07 23:04:57 +08:00
嗯。。。顺便问下怎么贴代码的。。。好像 markdown 在这儿不管用。。。
msg7086
2015-09-08 00:27:38 +08:00
@jhdxr 可以贴 gist 。
Caringor
2015-09-08 00:31:26 +08:00
不一定要這樣寫,不過我的話是習慣了。
Zzzzzzzzz
2015-09-08 00:32:45 +08:00
旧 php 版本存在 magic_quotes_gpc 并且为 on 的情况下不初始化变量有可能会导致安全问题, 只考虑最近版本的话用到可能未赋值的变量 isset 或者 empty 够了, 不过这类判断写多了也挺烦的.
cxbig
2015-09-08 01:12:20 +08:00
一般使用不需要
如果是判断里赋值,判断后使用,考虑在判断前加一个初始值
数组内特殊 index 最好先赋值
类属性空值( null, array (), ...)不用赋值。
arka
2015-09-08 07:49:25 +08:00
不声明在解析器严格模式就会报错。如果在 nginx fastcgi 下还可能白屏。找不到错误
LaughingMeMe
2015-09-08 11:43:40 +08:00
intNUM,arrData..and so on...
jianghu52
2015-09-08 12:51:54 +08:00
初始化还是很有必要的。在很多时候你初始化一个奇怪的变量,一出错很容易就能看的出来。
jhdxr
2015-09-08 13:40:17 +08:00
@msg7086 我的意思是像 LZ 那样子,他的代码好像明显有北京包围的。。。

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

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

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

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

© 2021 V2EX