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

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

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

    一般的代码都是先 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
    qwertyzzz
        1
    qwertyzzz  
       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
        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   ·   实用小工具   ·   5894 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 01:51 · PVG 09:51 · LAX 17:51 · JFK 20:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.