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

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

  •  1
     
  •   blue7wings · 2015-09-07 21:25:51 +08:00 · 4625 次点击
    这是一个创建于 3366 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写代码的时候,总是习惯像其他语言一样实现声明下变量(给默认值),比如,我知道$age 是表示年龄的话,我就会:
    $age = 0;

    好处:
    1. 当没有给这个变量赋值,而返回这个变量时会有一个默认的值.
    2. 条理更加清晰

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

    不知道各位有没有这个习惯,怎么看?

    22 条回复    2015-09-08 17:48:35 +08:00
    shidenggui
        1
    shidenggui  
       2015-09-07 21:27:52 +08:00
    不能链式赋值?
    `$v1 = $v2 = $v3 = 0;`
    bdbai
        2
    bdbai  
       2015-09-07 21:27:59 +08:00 via iPhone
    莫名其妙蹦个变量出来会很诡异。
    raincious
        3
    raincious  
       2015-09-07 21:31:29 +08:00
    你是说变量集体初始化操作?比如

    $currentTime = $nextTime = $expireTime = 0;

    这样的?

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

    $currentTime = 0;

    $currentTime = time ();

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

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

    还有:

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

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

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

    而且你可以认为每个变量的初始值是 null ,不确定是否初始化,则可以用 isset 来判断。
    zts1993
        9
    zts1993  
       2015-09-07 22:27:43 +08:00
    严谨的说是要的,,但是既然准备图省事那就不用了。。
    lzxgh621
        10
    lzxgh621  
       2015-09-07 22:58:08 +08:00 via Android   ❤️ 1
    Notice: Undefined index
    jhdxr
        11
    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
        12
    jhdxr  
       2015-09-07 23:04:57 +08:00
    嗯。。。顺便问下怎么贴代码的。。。好像 markdown 在这儿不管用。。。
    msg7086
        13
    msg7086  
       2015-09-08 00:27:38 +08:00
    @jhdxr 可以贴 gist 。
    Caringor
        14
    Caringor  
       2015-09-08 00:31:26 +08:00
    不一定要這樣寫,不過我的話是習慣了。
    Zzzzzzzzz
        15
    Zzzzzzzzz  
       2015-09-08 00:32:45 +08:00
    旧 php 版本存在 magic_quotes_gpc 并且为 on 的情况下不初始化变量有可能会导致安全问题, 只考虑最近版本的话用到可能未赋值的变量 isset 或者 empty 够了, 不过这类判断写多了也挺烦的.
    cxbig
        16
    cxbig  
       2015-09-08 01:12:20 +08:00
    一般使用不需要
    如果是判断里赋值,判断后使用,考虑在判断前加一个初始值
    数组内特殊 index 最好先赋值
    类属性空值( null, array (), ...)不用赋值。
    arka
        17
    arka  
       2015-09-08 07:49:25 +08:00
    不声明在解析器严格模式就会报错。如果在 nginx fastcgi 下还可能白屏。找不到错误
    LaughingMeMe
        18
    LaughingMeMe  
       2015-09-08 11:43:40 +08:00
    intNUM,arrData..and so on...
    jianghu52
        19
    jianghu52  
       2015-09-08 12:51:54 +08:00
    初始化还是很有必要的。在很多时候你初始化一个奇怪的变量,一出错很容易就能看的出来。
    jhdxr
        20
    jhdxr  
       2015-09-08 13:40:17 +08:00
    @msg7086 我的意思是像 LZ 那样子,他的代码好像明显有北京包围的。。。
    Conte
        21
    Conte  
       2015-09-08 16:44:41 +08:00
    我觉得初始化的左作用大于声明的意义
    Roope
        22
    Roope  
       2015-09-08 17:48:35 +08:00
    一般变量我都会初始化。特别是数组。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5456 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 05:58 · PVG 13:58 · LAX 21:58 · JFK 00:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.