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

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

  •  2
     
  •   darklinden · 266 天前 · 5804 次点击
    这是一个创建于 266 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天一个同事在吐槽 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 条附言  ·  266 天前
    感谢指出,手打代码手误了…

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

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

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

    使用命名空间的话,由于 autoload 的限制,一个文件对应一个类才方便自动加载。
    NSAgold
        36
    NSAgold  
       265 天前
    《 Why php is the best programming language 》
    james122333
        37
    james122333  
       265 天前
    @MengiNo

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