Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

swoole-cli 扩展 PHP 语言语法和 VM #90

Open
matyhtf opened this issue Nov 27, 2024 · 0 comments
Open

swoole-cli 扩展 PHP 语言语法和 VM #90

matyhtf opened this issue Nov 27, 2024 · 0 comments

Comments

@matyhtf
Copy link
Member

matyhtf commented Nov 27, 2024

背景

php-src对于一些基础语法的改进速度迟缓,而修改语法需要2/3以上绝对多数投票同意,需准备存在较长时间的辩论。为了解决我们项目中急需的一些语法。

swoole-cli v6 版本我们考虑自行对PHP语言和VM层面进行一些扩展,经过实际项目验证后,再向php-src提交RFCPR

改进方向

1. 数组和字符串作为对象

在其他编程语言中,数组和字符串均是作为一个对象存在的,例如JavaJSPython,数组和字符串均有内置的方法进行各种操作。而PHP中需要使用一个函数来对数组和字符串进行操作。这存在几个问题:

  • 需要记忆大量函数名称
  • 参数顺序,有时被操作的数组不是函数的第一个参数,例如 in_array
  • 不是很优雅

扩展语法将stringarray作为一种内置的final class,可以直接使用对象方法来进行操作。

数组方法

$array = [1, 2, 3, 99];

$array->contains(99);
$index = $array->indexOf(3);
$string = $array->join(';');

字符串对象

$str = "hello world!";

$true = $str->startsWith('hello');
$true = $str->endsWith('!');
$array = $str->split(' ');

2. 强类型数组

可强制限定数组的key和value类型,解决使用数组导致的类型黑洞问题。语法类似于C++的泛型写法,允许多层嵌套。

list 语法

array<int> $array = [1, 2, 3];
array<string> $array = ['hello', 'world'];
array<TestObject> $array = [new TestObject];
array<array<stdClass>> $array;

map 语法

array<int, string> $array = [1 => 'a', 2 => 'b', 3 => 'c'];
array<string, TestObject>  $array = [ 'first' => new TestObject];
array<string, array<stdClass>> $array;

3. AOT 预编译器

可在运行前对.php文件进行编译,生成.phpc文件。运行时仅需要.phpc文件即可,部署和分发不再需要 .php源文件。

编译

将检索整个目录,编译所有.php文件,在project_release/目录中生成.phpc文件。

swoole-cc project/ -o project_release/

运行

cd project_release/
# 运行 dev http server 
swoole-cli -S 127.0.0.1:9001 

# 运行 swoole server 守护程序
swoole-cli bin/server.php
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant