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

2022-03-12 17:27:13 +08:00
 darklinden

今天一个同事在吐槽 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);

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

6626 次点击
所在节点    程序员
39 条回复
darklinden
2022-03-12 22:13:58 +08:00
@guyeu 确实…手抖了…
xiangyuecn
2022-03-12 22:24:27 +08:00
糖吃多了 100%蛀牙
retrocode
2022-03-12 22:26:38 +08:00
php 这个是真的吊 妹的 自己写爽的呀批

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

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

直接不定义类型就可以了 反正到最后还是要判断
也没必要死磕 psr-4 你可以自写个 loader
原生 array 本身就是这么用的 需要类型可以自便
要求语言本身就要有不一定需要的东西是很糟糕的
只能说是一种习惯
fpure
2022-03-15 09:47:19 +08:00
刚刚在线测试了一下你的 lua 代码,并不能这么写
你可以试试 https://c.runoob.com/compile/66/
fpure
2022-03-15 09:48:08 +08:00
```lua
local test = {}
test['a'].b = 0
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/839895

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX