今天一个同事在吐槽 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 everyx 2022-03-12 17:29:47 +08:00 也要看你用的 PHP 版本 |
![]() | 2 eason1874 2022-03-12 17:46:44 +08:00 ![]() 这已经是正经代码了 我接触的一些 PHP 项目充满奇怪写法,把日志等级调到警告之后,警告日志以每秒几 MB 的速度增长,但是程序能正常跑 |
![]() | 3 westoy 2022-03-12 17:52:44 +08:00 我还以为是啥, 那是你都没见过中古用 @一把梭哈的代码........ |
![]() | 4 zakokun 2022-03-12 18:03:00 +08:00 你这同事稀里糊涂的。 php 的$test["a"]["b"] = 1024 作用是初始化二维数组并赋值。这个不会报错的。 如果弄个 $test["a"]->b = 1024 不报错才有鬼了。 |
5 dobelee 2022-03-12 18:07:39 +08:00 via iPhone ![]() 在 php 中这段代码的意思是给二维数组中的 b 赋值,不是没报错,是根本没有错误。 |
![]() | 6 PHP 开发环境不开 notice 级别错误显示,就是个二哈。 |
7 maigebaoer 2022-03-12 19:00:53 +08:00 via Android php 多维数组赋值和对象属性赋值没联系 |
![]() | 8 qeqv 2022-03-12 19:21:53 +08:00 ![]() PHP 的数组,想怎么用怎么用,终极省心。没有什么数据结构是一个数组解决不了的,如果有,就两个 |
![]() | 9 sadfQED2 2022-03-12 19:23:12 +08:00 via Android ![]() 我以为啥呢,世界第一编程语言,代码一堆 error 错误,然而丝毫不影响程序正常运行 |
![]() | 10 wonderfulcxm 2022-03-12 19:29:38 +08:00 via iPhone lua 的 table 很强大,可以表达别的语言中的数组、哈希表、对象,PHP 的数组可以表达别的语言中的数组、哈希,这么写没毛病,是对象是另外一种写法,而且不会用 print 来调试数组,不像 js 的数组就真的只是数组。 |
![]() | 11 wonderfulcxm 2022-03-12 19:34:35 +08:00 via iPhone 是对象是另外一种写法 ->而对象是另外一种写法 |
![]() | 12 Buges 2022-03-12 19:36:17 +08:00 via Android 初始化(声明)和赋值的混淆可以说是动态语言的一大糟粕。 |
![]() | 13 jousca 2022-03-12 19:41:16 +08:00 PHP 是个神奇牛逼的语言…… |
14 james122333 2022-03-12 19:50:42 +08:00 via Android 动态语言就是要方便 不然相比那些嗦的语言有什么长处 js 也很神奇 对象与数组分不清楚 |
15 newtype0092 2022-03-12 19:53:09 +08:00 @qeqv lua:我的 table 今天就要和你比一比~ |
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 |
![]() | 17 yaott2020 2022-03-12 20:59:17 +08:00 via Android 确实,PHP 很人性化,写起来很爽(不然怎么敢叫自己最好的编程语言) |
18 buffzty 2022-03-12 21:14:04 +08:00 ![]() 应该五六年前 php 就能写得跟 java 一模一样了,除了泛型没有. 他有垃圾语法你为什么要去用呢. 任何语言都可以写出垃圾. 人的问题非要怪到语言上. |
![]() | 19 guyeu 2022-03-12 21:31:16 +08:00 locla 是个 typo 吧,如果这都能跑的话确实有点惊讶 |
![]() | 20 airplayxcom 2022-03-12 21:35:54 +08:00 PHP 天下第一 怎么能错! |
21 darklinden OP @guyeu 确实…手抖了… |
![]() | 22 xiangyuecn 2022-03-12 22:24:27 +08:00 糖吃多了 100%蛀牙 |
![]() | 23 cvooc 2022-03-12 22:26:38 +08:00 php 这个是真的吊 妹的 自己写爽的呀批 一旦接手老项目就是噩梦的开始,反正怎么写都是对的,经手的人越多神奇的写法越多=.= |
![]() | 24 xiangyuecn 2022-03-12 22:30:50 +08:00 ![]() |
25 maigebaoer 2022-03-12 22:54:02 +08:00 via Android @buffzty php8 有泛型了 |
![]() | 26 MengiNo 2022-03-12 23:15:36 +08:00 @maigebaoer 并没有,只是多了个 TS 那种 联合类型 可以少定义几个接口罢了,而且还远没有 TS 那套完善。哪怕到现在 PHP8.1 还是连最基本的限制数组内的每个元素的类型保持一致,这种最基本的需求都无法实现。只能自定义一个继承自 ArrayObject 的类,通过构造函数 __construct(Type ...$data) 这样来模拟实现。本来这倒问题不大,但是 PSR4 要求一个 .php 文件只能有一个类,这样就导致了上面那种实现方式要搞出非常多重复的类(文件),非常不优雅让人难以接受。 |
27 Kiriya 2022-03-12 23:21:34 +08:00 PHP 和你只要有一个能跑就行了 |
28 buffzty 2022-03-12 23:24:28 +08:00 我觉得 php 的那个 union 类型是完完全全的鸡肋.我不会用这种东西. 要么就纯数组,如果需要元组就用对象代替. |
29 maigebaoer 2022-03-12 23:35:58 +08:00 via Android @MengiNo 谢谢指出,刚去查了下,语言本身确实是没有,只能用 docblock 加静态分析器。我记得数组元素不支持类型限制,主要是出于性能考虑。同文件不能定义多个类,确实不方便。我个人还是挺喜欢 php 这门语言,心智负担低。 |
![]() | 30 gyinbj 2022-03-12 23:49:45 +08:00 ![]() 这就是为什么 phper 不是在挖坑的路上,就是在填坑的路上。 每天都有小惊喜。 |
![]() | 31 mostkia 2022-03-13 11:03:21 +08:00 php 不清楚,js 应该是无法做到 test = {}; test['a'].b = 0;这句的,js 中的对象确可以未创建先使用,但仅限于第一维,不能直接访问未创建对象的子对象,否则会报 undefined 错误 |
![]() | 32 aristolochic 2022-03-13 15:30:03 +08:00 ![]() 所以……就是 https://en.wikipedia.org/wiki/Autovivification ? 应该是 Perl 带起来的概念吧。 |
![]() | 33 cszchen 2022-03-13 16:49:09 +08:00 via iPhone php 这个会有报错,不过是 notice 级别,可能他屏蔽了,离他远点 |
![]() | 34 leonlu 2022-03-13 17:12:53 +08:00 via iPhone js 的那个肯定不行呀 |
![]() | 35 vibbow 2022-03-13 19:07:25 +08:00 |
36 NSAgold 2022-03-14 10:31:51 +08:00 《 Why php is the best programming language 》 |
37 james122333 2022-03-14 14:04:51 +08:00 @MengiNo 直接不定义类型就可以了 反正到最后还是要判断 也没必要死磕 psr-4 你可以自写个 loader 原生 array 本身就是这么用的 需要类型可以自便 要求语言本身就要有不一定需要的东西是很糟糕的 只能说是一种习惯 |
38 fpure 2022-03-15 09:47:19 +08:00 刚刚在线测试了一下你的 lua 代码,并不能这么写 你可以试试 https://c.runoob.com/compile/66/ |
39 fpure 2022-03-15 09:48:08 +08:00 ```lua local test = {} test['a'].b = 0 ``` |