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

PHP 原来是这么神奇的语言吗?

  •  2
     
  •   darklinden · 2022-03-12 17:27:13 +08:00 · 6300 次点击
    这是一个创建于 748 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天一个同事在吐槽 lua 不好使,然后发我一段代码

    locla test = {}
    test['a'].b = 0
    

    我:“??? a 对应的对象没有初始化直接访问 b 属性不是崩崩崩?”

    回:“js 和 php 都能这么写啊...”

    我:“php 我写的少,js 这不是典型的 property of undefined 么?正常语言但凡有一个不报错的都见鬼了”

    于是人回了我一段

    var test = {};
    test['hasOwnProperty'].b = 0
    

    我:“... hasOwnProperty 是特么的通用函数,有对象的好么?你写段 php ”

    $test = array();
    $test["a"]["b"] = 1024;
    print($test);
    

    这见鬼的代码竟然不报错...

    第 1 条附言  ·  2022-03-12 22:12:49 +08:00
    感谢指出,手打代码手误了…

    其实比较纠结的在于其他语言一般二维数组也好,二维字典也好,一级需要先生成对象的,而 php 这神操作,二维数组的一维对象不存在的情况下直接默认对象了…我只能认为这是神奇的语法糖了…
    39 条回复    2022-03-15 09:48:08 +08:00
    everyx
        1
    everyx  
       2022-03-12 17:29:47 +08:00
    也要看你用的 PHP 版本 😂
    eason1874
        2
    eason1874  
       2022-03-12 17:46:44 +08:00   ❤️ 2
    这已经是正经代码了

    我接触的一些 PHP 项目充满奇怪写法,把日志等级调到警告之后,警告日志以每秒几 MB 的速度增长,但是程序能正常跑
    westoy
        3
    westoy  
       2022-03-12 17:52:44 +08:00
    我还以为是啥, 那是你都没见过中古用 @一把梭哈的代码........
    zakokun
        4
    zakokun  
       2022-03-12 18:03:00 +08:00
    你这同事稀里糊涂的。
    php 的$test["a"]["b"] = 1024 作用是初始化二维数组并赋值。这个不会报错的。
    如果弄个 $test["a"]->b = 1024 不报错才有鬼了。
    dobelee
        5
    dobelee  
       2022-03-12 18:07:39 +08:00 via iPhone   ❤️ 1
    在 php 中这段代码的意思是给二维数组中的 b 赋值,不是没报错,是根本没有错误。
    encro
        6
    encro  
       2022-03-12 18:12:32 +08:00
    PHP 开发环境不开 notice 级别错误显示,就是个二哈。
    maigebaoer
        7
    maigebaoer  
       2022-03-12 19:00:53 +08:00 via Android
    php 多维数组赋值和对象属性赋值没联系
    qeqv
        8
    qeqv  
       2022-03-12 19:21:53 +08:00   ❤️ 1
    PHP 的数组,想怎么用怎么用,终极省心。没有什么数据结构是一个数组解决不了的,如果有,就两个
    sadfQED2
        9
    sadfQED2  
       2022-03-12 19:23:12 +08:00 via Android   ❤️ 1
    我以为啥呢,世界第一编程语言,代码一堆 error 错误,然而丝毫不影响程序正常运行
    wonderfulcxm
        10
    wonderfulcxm  
       2022-03-12 19:29:38 +08:00 via iPhone
    lua 的 table 很强大,可以表达别的语言中的数组、哈希表、对象,PHP 的数组可以表达别的语言中的数组、哈希,这么写没毛病,是对象是另外一种写法,而且不会用 print 来调试数组,不像 js 的数组就真的只是数组。
    wonderfulcxm
        11
    wonderfulcxm  
       2022-03-12 19:34:35 +08:00 via iPhone
    是对象是另外一种写法
    ->而对象是另外一种写法
    Buges
        12
    Buges  
       2022-03-12 19:36:17 +08:00 via Android
    初始化(声明)和赋值的混淆可以说是动态语言的一大糟粕。
    jousca
        13
    jousca  
       2022-03-12 19:41:16 +08:00
    PHP 是个神奇牛逼的语言……
    james122333
        14
    james122333  
       2022-03-12 19:50:42 +08:00 via Android
    动态语言就是要方便 不然相比那些啰嗦的语言有什么长处 js 也很神奇 对象与数组分不清楚
    newtype0092
        15
    newtype0092  
       2022-03-12 19:53:09 +08:00
    @qeqv lua:我的 table 今天就要和你比一比~
    charlie21
        16
    charlie21  
       2022-03-12 20:22:51 +08:00
    php 里没有字典,因为 array 就是字典。说起神奇,这就不得不提到 stackoverflow php 区的名场面了:
    如何取得 php 数组的最后一个元素 php array last element speed - Google Search
    https://stackoverflow.com/questions/3687358/whats-the-best-way-to-get-the-last-element-of-an-array-without-deleting-it/41795859#41795859
    yaott2020
        17
    yaott2020  
       2022-03-12 20:59:17 +08:00 via Android
    确实,PHP 很人性化,写起来很爽(不然怎么敢叫自己最好的编程语言)
    buffzty
        18
    buffzty  
       2022-03-12 21:14:04 +08:00   ❤️ 1
    应该五六年前 php 就能写得跟 java 一模一样了,除了泛型没有. 他有垃圾语法你为什么要去用呢. 任何语言都可以写出垃圾.
    人的问题非要怪到语言上.
    guyeu
        19
    guyeu  
       2022-03-12 21:31:16 +08:00
    locla 是个 typo 吧,如果这都能跑的话确实有点惊讶
    airplayxcom
        20
    airplayxcom  
       2022-03-12 21:35:54 +08:00
    PHP 天下第一 怎么能错!
    darklinden
        21
    darklinden  
    OP
       2022-03-12 22:13:58 +08:00 via iPhone
    @guyeu 确实…手抖了…
    xiangyuecn
        22
    xiangyuecn  
       2022-03-12 22:24:27 +08:00
    糖吃多了 100%蛀牙
    retrocode
        23
    retrocode  
       2022-03-12 22:26:38 +08:00
    php 这个是真的吊 妹的 自己写爽的呀批

    一旦接手老项目就是噩梦的开始,反正怎么写都是对的,经手的人越多神奇的写法越多=.=
    xiangyuecn
        24
    xiangyuecn  
       2022-03-12 22:30:50 +08:00
    maigebaoer
        25
    maigebaoer  
       2022-03-12 22:54:02 +08:00 via Android
    @buffzty php8 有泛型了😎
    MengiNo
        26
    MengiNo  
       2022-03-12 23:15:36 +08:00
    @maigebaoer 并没有,只是多了个 TS 那种 联合类型 可以少定义几个接口罢了,而且还远没有 TS 那套完善。哪怕到现在 PHP8.1 还是连最基本的限制数组内的每个元素的类型保持一致,这种最基本的需求都无法实现。只能自定义一个继承自 ArrayObject 的类,通过构造函数 __construct(Type ...$data) 这样来模拟实现。本来这倒问题不大,但是 PSR4 要求一个 .php 文件只能有一个类,这样就导致了上面那种实现方式要搞出非常多重复的类(文件),非常不优雅让人难以接受。
    Kiriya
        27
    Kiriya  
       2022-03-12 23:21:34 +08:00
    PHP 和你只要有一个能跑就行了
    buffzty
        28
    buffzty  
       2022-03-12 23:24:28 +08:00
    我觉得 php 的那个 union 类型是完完全全的鸡肋.我不会用这种东西. 要么就纯数组,如果需要元组就用对象代替.
    maigebaoer
        29
    maigebaoer  
       2022-03-12 23:35:58 +08:00 via Android
    @MengiNo 谢谢指出,刚去查了下,语言本身确实是没有,只能用 docblock 加静态分析器。我记得数组元素不支持类型限制,主要是出于性能考虑。同文件不能定义多个类,确实不方便。我个人还是挺喜欢 php 这门语言,心智负担低。
    gyinbj
        30
    gyinbj  
       2022-03-12 23:49:45 +08:00   ❤️ 1
    这就是为什么 phper 不是在挖坑的路上,就是在填坑的路上。
    每天都有小惊喜。
    mostkia
        31
    mostkia  
       2022-03-13 11:03:21 +08:00
    php 不清楚,js 应该是无法做到 test = {}; test['a'].b = 0;这句的,js 中的对象确可以未创建先使用,但仅限于第一维,不能直接访问未创建对象的子对象,否则会报 undefined 错误
    aristolochic
        32
    aristolochic  
       2022-03-13 15:30:03 +08:00   ❤️ 1
    所以……就是 https://en.wikipedia.org/wiki/Autovivification
    应该是 Perl 带起来的概念吧。
    cszchen
        33
    cszchen  
       2022-03-13 16:49:09 +08:00 via iPhone
    php 这个会有报错,不过是 notice 级别,可能他屏蔽了,离他远点
    leonlu
        34
    leonlu  
       2022-03-13 17:12:53 +08:00 via iPhone
    js 的那个肯定不行呀
    vibbow
        35
    vibbow  
       2022-03-13 19:07:25 +08:00
    @maigebaoer 在不使用命名空间的时候,同文件是可以定义多个类的。

    使用命名空间的话,由于 autoload 的限制,一个文件对应一个类才方便自动加载。
    NSAgold
        36
    NSAgold  
       2022-03-14 10:31:51 +08:00
    《 Why php is the best programming language 》
    james122333
        37
    james122333  
       2022-03-14 14:04:51 +08:00
    @MengiNo

    直接不定义类型就可以了 反正到最后还是要判断
    也没必要死磕 psr-4 你可以自写个 loader
    原生 array 本身就是这么用的 需要类型可以自便
    要求语言本身就要有不一定需要的东西是很糟糕的
    只能说是一种习惯
    fpure
        38
    fpure  
       2022-03-15 09:47:19 +08:00
    刚刚在线测试了一下你的 lua 代码,并不能这么写
    你可以试试 https://c.runoob.com/compile/66/
    fpure
        39
    fpure  
       2022-03-15 09:48:08 +08:00
    ```lua
    local test = {}
    test['a'].b = 0
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5073 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 09:35 · PVG 17:35 · LAX 02:35 · JFK 05:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.