V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  humpy  ›  全部回复第 6 页 / 共 6 页
回复总数  104
1  2  3  4  5  6  
2017-12-15 18:10:48 +08:00
回复了 SimbaPeng 创建的主题 PHP 哪位 PHP 大神来解答一下优先级和结合性的问题???
@SimbaPeng + 是双目运算符,++ 是单目运算符
2017-12-15 18:09:16 +08:00
回复了 SimbaPeng 创建的主题 PHP 哪位 PHP 大神来解答一下优先级和结合性的问题???
至于这个问题,
>>> function foo(){ return 0; }
>>> if (!$a = foo()) { echo 1; }
1⏎

刚才翻了一下源码,似乎是 parser 定义的锅...

Zend/zend_language_parser.y :

| '!' expr { $$ = zend_ast_create_ex(ZEND_AST_UNARY_OP, ZEND_BOOL_NOT, $2); }

「!$a = foo()」这条语句,在语法解析时,会先解析 「$a = foo()」为赋值语句,然后再匹配到 「'!' expr 」

另外,根据这里的语法定义,似乎「~」运算符也有同样的问题...
2017-12-15 16:32:50 +08:00
回复了 SimbaPeng 创建的主题 PHP 哪位 PHP 大神来解答一下优先级和结合性的问题???
要知道这个表达式「$i + $i++ + ++$i 」的求值顺序,应用三条语法规则就清楚了:

1. 「+」 是双目运算符
2. 同一表达式中多个「+」 的结合方向是从左到右「同一行中的运算符具有相同优先级,此时它们的结合方向决定求值顺序」
3. 递增「 i++/++i 」优先级高于 「+」

所以这个表达式的求值顺序即为:
1. $i + $i++
= $i++ + $i
= 1 + 2
= 3

2. 3 + ++$i
= ++$i + 3
= 3 + 3
= 6

实际上你将它们的 opcode dump 出来就很清晰了:
L2 #0 EXT_STMT
L2 #1 ASSIGN $a 1
L4 #2 EXT_STMT
L4 #3 POST_INC $a ~1
L4 #4 ADD $a ~1 ~2
L4 #5 PRE_INC $a @3
L4 #6 ADD ~2 @3 ~4
L4 #7 ECHO ~4
L6 #8 RETURN 1
2017-10-21 23:48:39 +08:00
回复了 gouchaoer 创建的主题 PHP 我也来吐槽 PHP 最垃圾的地方
@gouchaoer
语法像 c 是因为它最开始就是作为封装了一批 c 函数专用于做网页的 dsl 出现的,像 java 是因为 php5 就是照着 java 抄的

php 在语法设计上始终让人感觉设计师没上心,一种凑合凑合能用就行的样子。背着一堆历史包袱舍不得丢,为了新特性又引入另一些奇奇怪怪的符号,整个语言给人一种不统一不协调的感觉
比如上面说的反斜线,你见过其他哪个主流语言用过这符号吗?没人用是因为它真的难看,感受一下:
java: com.v2ex.php.Someone.doSth()
c++: v2ex::php::Someone::doSth()
php:\V2ex\Php\Someone::doSth()

再比如变量声明,c 系语言采用类型在变量前面的声明语法:int i; 相应的,函数的返回类型也放在声明的前面:int do_sth(int i);这在语法上是一致的
go/rust/kotlin 等采用类型在变量后面的声明语法:var i int ;函数的返回类型也放在函数声明的最后 func doSth(i int) int; 它们在语法上也是一致的
php 是怎么做的呢?函数形参,类型在参数名称前;函数返回类型,又放在函数最后,还用一个冒号隔开:function doSth(int i): int,这当然不影响使用,但是真是不舒服啊

再去看看 php.net/rfc 里面的提案,更多乱七八糟的符号在排队申请加入 php。由于 @ 被用来当错误抑制符了,[]数组在用,<>估计想留给泛型,注解的支持者们提出的注解语法是什么呢?<< annotation >>,还是从 hack 那抄的

php7 增强了类型,但又不做全,想知道类属性的类型只能靠程序员自觉写 docblock,想做接口文档自动生成、json 反序列化为具体类型麻烦得要死

数组太“强大”,程序员们干什么都喜欢用数组,它什么都能装,完全不同的东西也可以装在一起,不到运行时根本不知道里面都装了些啥,IDE 无法索引推导,无法代码提示,无法一键重构;自动化工具通过反射得不到数组项类型,无法生成靠谱的文档、无法有效的代码检查;使用时各种 isset、各种 assert,防止非预期的数组值,想必这些丑陋的数组项检查代码不陌生吧? if (isset($array[$key]) && ($array[$key] || $array[$key] == 0))) {}

一些很有用的基础语法(比如 enum、泛型)不添加,东抄一个 trait,西抄一个 yield,使用场景还很有限

语言 sdk 全是 c 实现,没有官方的代码库可以作为代码风格范例,长时间代码风格都是乱七八糟的,接触的程序员里就属 php 的代码风格最不羁;更不要说标准库里各种函数命名、参数命名、参数位置不规范不统一的问题了

而关于语言未来的发展,官方一直不给出一个明确的 roadmap,rfc 里的提案又乌烟瘴气乱七八糟,这个语言对未来的规划是怎样?它准备改进哪些方面、考虑加入哪些特性,它对自己的定位是什么?它是否考虑过目前存在的项目变大变复杂就要更换语言技术栈的情况?怎么面对 java、go 在日渐流行的微服务化潮流中带来的挑战?



睡觉
1  2  3  4  5  6  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1866 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 10ms · UTC 16:23 · PVG 00:23 · LAX 08:23 · JFK 11:23
Developed with CodeLauncher
♥ Do have faith in what you're doing.