业余程序员 Michael Snoyman;下图来自 Developing Web Applications with Haskell and Yesod
PHP SKRRRRRRRRRRRR
然后是喜闻乐见地吐槽 @eechen 时间:Perl和PHP用点号(.)连接字符串的好处是不用像JS等脚本用加号(+)连接字符串时进行额外的判断 确定是否是字符串连接需要判断二者是不是 string,但是作为动态语言,即使确定是字符串连接,依然要判断二者是否是 string;直接看 zend_ini_add_string 的代码 php/php-srcstatic void zend_ini_add_string(zval *result, zval *op1, zval *op2) {
...
if (Z_TYPE_P(op1) != IS_STRING) { .... }
if (Z_TYPE_P(op2) != IS_STRING) {....}
} Perl和PHP用$修饰变量的好处是变量的命名不受关键词和保留字约束,跟常量名和函数名区分,一目了然,还能简化字符串插值(模板字符串). 我就不说这直接取消了正常路径下把函数(以及类作为一种函数)当作第一成员的方法。说了 phper 也听不懂。
说能简化模板我觉得也太扯了,来看看 js- `JS can evaluate expression inside template, like ${IS_DEV ? 'development' : 'production'}`
复制代码 然后 hs- [r|Haskell can have expression inside bracket like $(DEV $> "Dev" return "Production")|]
复制代码
然后 php 呢?- $isDevString = IS_DEV ? "DEV" : "PROD";return "PHP cannot have expression inside string, and you must write like $isDevString"
复制代码
不过我也能理解,php 5.3 那群人对 PL 的理解和 @eechen 不相上下,所以写出了那么难看的闭包实现。
实际上为什么 php 用 $ 呢;因为他们早期实现者不会写 parser,用 lex 时来将 $ 强行作为变量美滋滋。
PS: Php 后期似乎支持了 template 中加 expression(没有测过),但是语法是 {${expr}} 两层括号....听说有人说 php 的模板字符串是简化的
更新:{${}} 里面无法加入 expression。
|