Echo 语言: PHP 生态下的另一个选择

Echo 语言致力于在 PHP 生态中消灭 PHP 历史遗留或为了保持兼容而产生的不一致性。 通过在编译层面将清晰的 Echo 代码转换为 PHP 代码来规避边际问题。

## 概述

PHP 的变量沿袭 Perl 风格, 使用美元符号 `$` 作为变量的一部分, 使用 `.`作为连接字符串符。 按 Perl 的设计思想,使用点符号可以更清晰表示字符串 “连接” ,而不是像其他语言使用 `+` (算数运算)。 抛开设计哲学, 使用 `.` 连接字符串的一个弊端是访问属性使用箭头操作符 `->`  , 这样的设计面向对象语言中很少见, 因为 OOP 中对属性的访问很频繁。

PHP 使用 `::` 来引用魔术常量, 类静态成员, 与其访问非静态成员的方式不一致。 优点是调用时很好区分静态成员。

PHP 存在着大量的魔术方法、 魔术常量


PHP 的变量没有块级作用于, 定义于 `for` `if` 等结构中的变量在外部仍能够使用。

PHP 定义函数和函数类型时, 都使用了 `function` 关键字, 定义闭包时又新增了 `fn` 关键字, 而函数类型声明又分为 `callable` 和 `Closure` 。换而言之, 函数并未成为 PHP 的一等公民。

作为弱类型语言, PHP 本身就是泛型的。 但 PHP 没有提供优秀的语法糖来处理类型。 `is_int()` , `is_string()` , `instanceof` 等函数返回布尔值, 无法流畅调用。

字符串与字节流没有区分, 导致使用多字节字符串需要使用 `mb_string` 拓展函数。

## 特性

+ 支持 JSX 风格语法来取代HiDoc 语法并提供 DOM解析与反射

### 变量

* 变量可以直接定义,不需要也不能使用 `$` 
* 使用点 `.` 访问类属性(静态和非静态)

### 关键字

* 增加 `is` 关键字,类型判断, 返回布尔值。替代 `is_*`,`instanceof`
* 增加 `as` 关键字, 进行强制类型转换

* 删除 `foreach`, `while`, `do-while` 等循环关键字, 仅保留 `for` 循环并增加 `for ... in` 变体替代 `foreach` 
* 删除 `extends` 和 `implements` 关键字, 使用`:` 替代 `class <name>: <parent-class>, <interface>` 
* 删除 `new` 关键字, 直接使用类名函数创建对象
* 删除 `fn` 关键字, 直接使用闭包语法 `() => ...` x =\> …` () => {   }`

## 结构

* 支持类内嵌套枚举(类的枚举)

概述

PHP 的变量沿袭 Perl 风格, 使用美元符号 $ 作为变量的一部分, 使用 .作为连接字符串符。 按 Perl 的设计思想,使用点符号可以更清晰表示字符串 “连接” ,而不是像其他语言使用 + (算数运算)。 抛开设计哲学, 使用 . 连接字符串的一个弊端是访问属性使用箭头操作符 -> , 这样的设计面向对象语言中很少见, 因为 OOP 中对属性的访问很频繁。

PHP 使用 :: 来引用魔术常量, 类静态成员, 与其访问非静态成员的方式不一致。 优点是调用时很好区分静态成员。

PHP 存在着大量的魔术方法、 魔术常量

PHP 的变量没有块级作用于, 定义于 for if 等结构中的变量在外部仍能够使用。

PHP 定义函数和函数类型时, 都使用了 function 关键字, 定义闭包时又新增了 fn 关键字, 而函数类型声明又分为 callableClosure 。换而言之, 函数并未成为 PHP 的一等公民。

作为弱类型语言, PHP 本身就是泛型的。 但 PHP 没有提供优秀的语法糖来处理类型。 is_int() , is_string() , instanceof 等函数返回布尔值, 无法流畅调用。

字符串与字节流没有区分, 导致使用多字节字符串需要使用 mb_string 拓展函数。

特性

  • 支持 JSX 风格语法来取代HiDoc 语法并提供 DOM解析与反射

变量

  • 变量可以直接定义,不需要也不能使用 $ 
  • 使用点 . 访问类属性(静态和非静态)

关键字

  • 增加 is 关键字,类型判断, 返回布尔值。替代 is_*,instanceof
  • 增加 as 关键字, 进行强制类型转换

  • 删除 foreach, while, do-while 等循环关键字, 仅保留 for 循环并增加 for ... in 变体替代 foreach 

  • 删除 extendsimplements 关键字, 使用: 替代 class <name>: <parent-class>, <interface> 
  • 删除 new 关键字, 直接使用类名函数创建对象
  • 删除 fn 关键字, 直接使用闭包语法 () => ... x => … () => { }

结构

  • 支持类内嵌套枚举(类的枚举)