PHP Class 使用全命名空间有什么坏处? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
a7dog
V2EX    PHP

PHP Class 使用全命名空间有什么坏处?

  •  
  •   a7dog 2021-02-19 11:19:47 +08:00 3515 次点击
    这是一个创建于 1708 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一般的代码都是先 use 然后使用,但是这种不大好替换,搜索相关代码调用也不是很明了,我一般直接使用全路径,方便替换,比如 如果 User 要改成 Staff,可以全局搜索\ModelSpace\User 。 使用方法 2, 有什么不好的地方呢?很少看到别人这样做。

    // 方法 1 use ModelSpace\User; User::find($id) // vs // 方法 2 \ModelSpace\User::find($id); 
    30 条回复    2021-06-03 15:09:33 +08:00
    asLw0P981N0M0TCC
        1
    asLw0P981N0M0TCC  
       2021-02-19 11:23:52 +08:00
    a7dog
        2
    a7dog  
    OP
       2021-02-19 11:25:26 +08:00
    @qwertyzzz 看习惯也还行,一看就知道是属于哪里的
    334132462
        3
    334132462  
       2021-02-19 11:30:15 +08:00
    唯一缺点 可能取类名时得想很久
    keepeye
        4
    keepeye  
       2021-02-19 11:34:46 +08:00
    都感觉有点陌生了,两年多没写 PHP 了
    Makoto
        5
    Makoto  
       2021-02-19 11:34:47 +08:00
    这样真的感觉很长,而且代码量比较重复
    lovecy
        6
    lovecy  
       2021-02-19 11:37:24 +08:00
    有工具插件能自动补全也还行,
    a7dog
        7
    a7dog  
    OP
       2021-02-19 11:39:00 +08:00
    @Makoto 也就是 namespace 重复,但是实际上就是一个字母,并不长
    agdhole
        8
    agdhole  
       2021-02-19 11:40:05 +08:00
    全局替换你直接替换 use 的不也可以吗?
    a7dog
        9
    a7dog  
    OP
       2021-02-19 11:42:10 +08:00
    @agdhole 换 use 的,对应使用的的 class 会自动改吗,或者有插件可以实现这个功能?比如

    use ModelSpace\User; 变成了 use ModelSpace\Staff,

    User::find($id) 会自动变成 Staff::find($id) ?
    agdhole
        10
    agdhole  
       2021-02-19 11:45:40 +08:00
    @a7dog #9 使用 phpstorm 重构功能
    junan0708
        11
    junan0708  
       2021-02-19 11:46:00 +08:00
    use ModelSpace\Staff as User 。不是更简单?
    BeautifulSoap
        12
    BeautifulSoap  
       2021-02-19 11:49:47 +08:00
    所以说这不就体现了 IDE 的优点了

    用 IDE 的话把 User 改名了,它会自动分析其他代码将所有引用了 User 的地方自动改成 Staff
    lap510200
        13
    lap510200  
       2021-02-19 11:52:22 +08:00
    第一种配合 ide 用就很方便和稳,第二种和每个类起唯一名没啥区别
    a7dog
        14
    a7dog  
    OP
       2021-02-19 11:52:33 +08:00
    @junan0708 这样感觉不好,如果改名,会全部改
    a7dog
        15
    a7dog  
    OP
       2021-02-19 11:54:00 +08:00
    @BeautifulSoap 这就很强大了,VSC 还没看到这个功能
    drush
        16
    drush  
       2021-02-19 11:56:21 +08:00
    @junan0708 #11 接手的人怕会天天想念你
    debuggerx
        17
    debuggerx  
       2021-02-19 12:09:38 +08:00
    1. 即使是只有自己会看会写的代码,最好也不要抱着“看习惯也还行”的想法写大多数人不习惯的代码,否则写别的代码的时候也会缺乏规范意识。
    2. 善用 IDE,编辑器终归只是编辑器。想想那么多人宁愿花钱用 IDE 都不选免费的 vsc 就知道,差距还是不小的。
    a7dog
        18
    a7dog  
    OP
       2021-02-19 12:21:26 +08:00
    @debuggerx 实际上只有 model 类的代码会这样,团队 4 人,实际开发中感觉没有什么不便。
    changz
        19
    changz  
       2021-02-19 12:31:24 +08:00 via Android
    BeautifulSoap
        20
    BeautifulSoap  
       2021-02-19 13:41:57 +08:00
    @a7dog VSC 也只是编辑器,基于文本的查找替换行,但是涉及到变量重命名这种场景的时候,是需要编辑器分析理解整个项目代码的,这种重量级的功能需求还是主流 IDE 才行
    sanqian
        21
    sanqian  
       2021-02-19 14:17:51 +08:00
    这样真的丑。。
    klgd
        22
    klgd  
       2021-02-19 14:42:43 +08:00
    @keepeye #4 两年? 是 10 年吧 php 的命名空间是 5.3 时引入的 现在都 8 了
    keepeye div class="fr">     23
    keepeye  
       2021-02-19 15:27:39 +08:00
    @klgd 我是说两年没写 php 看代码有点生疏,不是说没接触过命名空间
    k396656156
        24
    k396656156  
       2021-02-19 15:52:13 +08:00
    看不懂你要这样写,你改起来不是很麻烦,改漏了不是出问题了
    Still4
        25
    Still4  
       2021-02-19 16:08:55 +08:00
    太长了,不方便看,你举的例子里面只用了一次,如果调用几十次,第一眼看过去,你自己都会骂哪个傻*这么写的,都不知道精简下

    use TencentAds\Model\AdsGetResponseData;
    use TencentAds\Model\AdvertiserGetListStruct;
    use TencentAds\Model\AdvertiserGetResponseData;
    use TencentAds\Model\BusinessManagerRelationsGetResponseData;
    use Google\Ads\GoogleAds\V5\Enums\AdGroupStatusEnum\AdGroupStatus;
    use Google\Ads\GoogleAds\V5\Enums\CampaignStatusEnum\CampaignStatus;

    给你看下某个广告库的代码,光是引用就这么长,意味着你要是看代码逻辑得拖到屏幕一半,心理负担太重
    guanhui07
        26
    guanhui07  
       2021-02-19 16:52:59 +08:00
    use ModelSpace\Staff as User
    konakona
        27
    konakona  
       2021-02-19 17:22:28 +08:00
    那是因为你没有用好的 IDE ! phpstorm,你重构一个类的名称,那么所有项目底下使用到这个类的都会自己改。
    a7dog
        28
    a7dog  
    OP
       2021-02-19 17:39:34 +08:00
    @Still4 这么长应该会用 use 的,我们实际用全 namespace 只在一个字母的 namespace 情况下
    MengiNo
        29
    MengiNo  
       2021-02-19 19:06:33 +08:00
    不过现在 IDE 补全的时候都会自动导包吧... 就算是第二种写法 只要写个 User::find 后面选好补全后,IDE 不就自己会去 use 一个叫 User 的类进来。我用 vscode 是比较习惯手动选包,但是 phpstorm 这种早就把代码分析好了,应该直接就可以回车补全 + 导包 同时完成吧。
    chenzheyu
        30
    chenzheyu  
       2021-06-03 15:09:33 +08:00
    @a7dog
    ```
    use ModelSpace\Staff as User,
    ```
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5247 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 08:10 PVG 16:10 LAX 01:10 JFK 04:10
    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