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

所有使用 namespace 的 php 框架,一律无视

  •  
  •   ddyy · 2014-05-12 16:00:02 +08:00 · 9515 次点击
    这是一个创建于 3849 天前的主题,其中的信息可能已经有所发展或是发生改变。
    php的命名空间是全世界最丑陋最难用的命名空间,亲爱的Yii 2.0也开始使用namespace了,Yii已死,有事烧纸。
    40 条回复    2014-05-14 23:33:22 +08:00
    lizheming
        1
    lizheming  
       2014-05-12 16:27:32 +08:00   ❤️ 1
    好吧,其实我也是....看到用namespace的就觉得蛋疼...
    barbery
        2
    barbery  
       2014-05-12 16:42:12 +08:00
    我觉得namespace好用啊,不过sublime 等IDE都不会识别倒是真的。。。
    66beta
        3
    66beta  
       2014-05-12 16:45:51 +08:00
    还好吧,只是在我朝的虚拟主机上,全部死
    ddyy
        4
    ddyy  
    OP
       2014-05-12 16:46:30 +08:00
    @barbery 如果用过python的namespace,对php的namespace看都不愿看一眼。ruby的namespace都比php的好用
    saharabear
        5
    saharabear  
       2014-05-12 16:53:25 +08:00
    为什么说难用?
    nantmpeter
        6
    nantmpeter  
       2014-05-12 17:28:56 +08:00
    求科普下,卤煮,让我等涨涨姿势
    CoX
        7
    CoX  
       2014-05-12 17:33:10 +08:00
    那是不是只剩下CodeIgniter了
    h2ero
        8
    h2ero  
       2014-05-12 17:33:26 +08:00
    很好用啊, 不支持namespace的框架现在还有人会用。
    raincious
        9
    raincious  
       2014-05-12 17:33:36 +08:00
    习惯了就好。已经看着这些namespace一年多了,默默地接受了,连自己的框架都支持了……当然楼主肯定是不会用的……

    其实我觉得挺好的啊,把它当路径标识符用呗。
    h2ero
        10
    h2ero  
       2014-05-12 17:35:40 +08:00
    现在流行的框架有几个没有用, 轻的重的,Zend Framework都用了。
    ddyy
        11
    ddyy  
    OP
       2014-05-12 17:38:28 +08:00
    @raincious 用 “/” 都比用 “\” 好看,起码有路径的感觉,搞不明白当初为什么不用 / 反而选择了别扭的 \ ,听说委员会还是激烈争论以后决定使用 \
    ddyy
        12
    ddyy  
    OP
       2014-05-12 17:40:18 +08:00
    @h2ero 框架在源代码里用是他们的事,别逼着用户使用框架的时候再引用一串 \ 就行,违和感太强烈了,使用命名前缀都比反斜线美观
    ddyy
        13
    ddyy  
    OP
       2014-05-12 17:41:10 +08:00   ❤️ 1
    当然,有审美洁癖的人用php本身就是自虐
    andyhu
        14
    andyhu  
       2014-05-12 17:42:32 +08:00
    个人习惯的问题,namespace比那种直接CXxxx的命名其实优雅很多,勇夺了就知道了
    andyhu
        15
    andyhu  
       2014-05-12 17:42:48 +08:00
    更正错字,用多了
    Monad
        16
    Monad  
       2014-05-12 18:07:05 +08:00 via iPhone
    cxx 路过
    谁能举个例子 我没看懂
    莫非是yii\framework\listener这样的?
    vigoss
        17
    vigoss  
       2014-05-12 18:21:43 +08:00
    结合composer命名空间挺无痛的。完全能分离目录和命名的关系。心随我动。用了可能有不舒服的地方,但是总比没用舒服多了。
    Sunyanzi
        18
    Sunyanzi  
       2014-05-12 19:14:34 +08:00   ❤️ 1
    这又是准备吵一场的节奏么 ... 嘛 ... 你要战那便战吧 ...

    其实如果不拿 php 的 namespace 当个 namespace 而只是当个 prefix 的话还是挺好用的 ...

    这东西作为一个 namespace 显然不够格 ... 但说它全世界最丑陋最难用 ... 怕也有失公允 ...

    用我手边的代码举个栗子 ... 随便截了几行见下图 ...



    那么聪明的你告诉我 ... 如果没有 namespace ... 这些类的 autoloading 如何做 ..?

    都堆在同一个路径下 ..? 定义一个非常非常非常长的类名 ..? 写配置文件做依赖注入 ..?

    虽然现在这个 namespace 的实现方式也不怎么优雅 ... 但至少比上面提及的三个方式要好多了 ...

    至于 backslash 这个事情 ... 我也不喜欢 ...

    但原因并不是因为不好看 ... 而是每次我在字符串里写命名空间的时候要写成 \\ 这样 ...

    但没有办法 ... php 的领域里已经没有另外的特殊字符可以用作 namespace 了 ...

    不管你喜欢与否这已经是无可改变的事实 ... 如果觉得实在无法接受请再也不要碰 php ...

    相比起你不喜欢这个语法 ... 我更不喜欢的是对 namespace 的滥用 ...

    一个文件一打开就是五十多行 use ... 不读代码 ... 光那个视觉效果就够让人目眩神迷了 ...

    总而言之虽然 php 的 namespace 语法被广为诟病 ... 但也不是一无是处 ...

    要指责的话指责那些写出烂程序的人去 ... namespace 好端端的招你惹你了冲它发什么火儿 ...
    aisk
        19
    aisk  
       2014-05-12 19:28:31 +08:00
    @ddyy / 的话和除操作会不会冲突?
    raincious
        20
    raincious  
       2014-05-12 19:48:08 +08:00
    @Sunyanzi 你可以不用\\这样写,照样能识别啊,又不会把A-Z转义了,难道有规范说必须写?。

    ddyy
        21
    ddyy  
    OP
       2014-05-12 19:55:43 +08:00 via Android
    @aisk 解释器可以先判断是命名空间还是常量,解释型语言动态判断类型很常见啊,其他动态语言字符串相加和数字相加都用加号,其实这两个相加运算也是完全不同的
    crysng
        22
    crysng  
       2014-05-12 20:00:03 +08:00   ❤️ 1
    php不是亏在namespace而是亏在.(dot)上面
    不然就不会出现object->method(),应该是object.method(),,(多敲了两下键盘)
    相对应的,namespace就应该是.(dot)而不是\backslash了,,哈哈

    这个.(dot)设计可能为当初的php4运行速度有所帮助吧
    Sunyanzi
        23
    Sunyanzi  
       2014-05-12 21:08:56 +08:00
    @raincioushttp://php.net/language.types.string ...

    「To specify a literal backslash, double it (\\).」

    虽然表现上确实没什么区别就是了 ...
    trimleo
        24
    trimleo  
       2014-05-12 21:24:32 +08:00
    我感觉用着挺好的 配合composer 自动加载无压力
    raincious
        25
    raincious  
       2014-05-12 22:01:00 +08:00
    @Sunyanzi 嗯……这个是这么说的呢嗯……

    我大概知道你为什么要这么玩,是不是你用双引号了?如果用双引号,同时的namespace里面有小写的对象名(外加第一个字符是rnt什么的话),那么真的会有玩托的风险。



    当然,我大单引号就没事,啊哈哈,这也是为啥我一直坚持单双引号严格区分的原因。
    lizheming
        26
    lizheming  
       2014-05-12 22:07:22 +08:00
    @Sunyanzi 孙大大T_T...我只是单纯的不喜欢用反斜线而已T_T...感觉用下划线也比用反斜线要来的爽啊,一来看起来丑,而来打起来也麻烦,完全不习惯啊有没有...
    liuxurong
        27
    liuxurong  
       2014-05-12 22:24:38 +08:00
    CodeIgniter欢迎你。
    soli
        28
    soli  
       2014-05-12 22:40:28 +08:00
    @ddyy

    > 如果用过python的namespace,对php的namespace看都不愿看一眼。

    不能同意你更多。
    kenzi
        29
    kenzi  
       2014-05-12 22:46:45 +08:00 via iPad
    写了五年 php, 不会 namespace 的飘过。。。 准备学习下了。。
    soli
        30
    soli  
       2014-05-12 22:47:30 +08:00
    另外,use XX; 竟然不能像 C++ 那样,把这个命名空间下的所有类都引入进来。
    usedname
        31
    usedname  
       2014-05-12 22:57:55 +08:00 via Android
    我觉得用起来很顺手啊,只是说它引入的太晚所以被喷的体无完肤了么?
    regmach
        32
    regmach  
       2014-05-12 23:04:01 +08:00
    楼主有在什么YII群吗?
    vibbow
        33
    vibbow  
       2014-05-13 06:26:41 +08:00
    其实 \ 在英国键盘上敲起来特别顺手...
    bakac
        34
    bakac  
       2014-05-13 07:05:43 +08:00
    这个其实还好,可以autoload 没必要喷
    Yuansir
        35
    Yuansir  
       2014-05-13 09:14:27 +08:00
    以前不习惯,后来用上Laravel,各种习惯了
    raincious
        36
    raincious  
       2014-05-13 09:19:05 +08:00
    @soli

    你可以 use Name\Space\Solar;

    然后Solar\Planet,Solar\Sun,Solar\Moon啊。
    mikej
        37
    mikej  
       2014-05-13 10:16:40 +08:00
    @Sunyanzi 你这里的引用是不是跟require效果一样呢?
    soli
        38
    soli  
       2014-05-13 10:23:32 +08:00
    @raincious

    就是不想 Solar\ 哈。

    为什么不直接 Planet、Sun、Moon 呢?
    Sunyanzi
        39
    Sunyanzi  
       2014-05-13 11:36:17 +08:00
    @mikej 事实上这并不是一个引用 ( reference ) ... 这只是命名空间声明 ...

    php 使用未定义的类的时候会触发 autoload ... 具体的加载方式由 autoload 函数决定 ...

    换言之是不是跟 require 效果一样是由你决定的 ... php 并不会自动 require ...
    mikej
        40
    mikej  
       2014-05-14 23:33:22 +08:00
    @Sunyanzi 类的 autoloading 由 autoload函数决定,而namespace是解决了类/函数/常量的命名规范问题,这两者有什么关联,能否详细解释一下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6006 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 03:06 · PVG 11:06 · LAX 19:06 · JFK 22:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.