PHP 有没有必要进行变量声明? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
blue7wings
V2EX    PHP

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

  •  1
     
  •   blue7wings Sep 7, 2015 5248 views
    This topic created in 3884 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

    $currentTime = $nextTime = $expireTime = 0;

    这样的?

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

    $currentTime = 0;

    $currentTime = time ();

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

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

    还有:

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

    }
    tabris17
        8
    taris17  
       Sep 7, 2015
    是个好习惯,但是不是必须

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

    而且你可以认为每个变量的初始值是 null ,不确定是否初始化,则可以用 isset 来判断。
    zts1993
        9
    zts1993  
       Sep 7, 2015
    严谨的说是要的,,但是既然准备图省事那就不用了。。
    lzxgh621
        10
    lzxgh621  
       Sep 7, 2015 via Android   1
    Notice: Undefined index
    jhdxr
        11
    jhdxr  
       Sep 7, 2015
    不确定楼主所说的『变量声明』是指什么。
    `$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  
       Sep 7, 2015
    嗯。。。顺便问下怎么贴代码的。。。好像 markdown 在这儿不管用。。。
    msg7086
        13
    msg7086  
       Sep 8, 2015
    @jhdxr 可以贴 gist 。
    Caringor
        14
    Caringor  
       Sep 8, 2015
    不一定要,不我的是了。
    Zzzzzzzzz
        15
    Zzzzzzzzz  
       Sep 8, 2015
    旧 php 版本存在 magic_quotes_gpc 并且为 on 的情况下不初始化变量有可能会导致安全问题, 只考虑最近版本的话用到可能未赋值的变量 isset 或者 empty 够了, 不过这类判断写多了也挺烦的.
    cxbig
        16
    cxbig  
       Sep 8, 2015
    一般使用不需要
    如果是判断里赋值,判断后使用,考虑在判断前加一个初始值
    数组内特殊 index 最好先赋值
    类属性空值( null, array (), ...)不用赋值。
    arka
        17
    arka  
       Sep 8, 2015
    不声明在解析器严格模式就会报错。如果在 nginx fastcgi 下还可能白屏。找不到错误
    LaughingMeMe
        18
    LaughingMeMe  
       Sep 8, 2015
    intNUM,arrData..and so on...
    jianghu52
        19
    jianghu52  
       Sep 8, 2015
    初始化还是很有必要的。在很多时候你初始化一个奇怪的变量,一出错很容易就能看的出来。
    jhdxr
        20
    jhdxr  
       Sep 8, 2015
    @msg7086 我的意思是像 LZ 那样子,他的代码好像明显有北京包围的。。。
    ConteMan
        21
    ConteMan  
       Sep 8, 2015
    我觉得初始化的左作用大于声明的意义
    Roope
        22
    Roope  
       Sep 8, 2015
    一般变量我都会初始化。特别是数组。
    About     Help     Advertise     Blog     API     FAQ     Solana     906 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 66ms UTC 22:18 PVG 06:18 LAX 15:18 JFK 18:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86