xp-framework / compiler
XP 编译器
v9.3.0
2024-09-01 13:02 UTC
Requires
- php: >=7.4.0
- xp-framework/ast: ^11.3
- xp-framework/core: ^12.0 | ^11.6 | ^10.16
- xp-framework/reflection: ^3.2 | ^2.15
Requires (Dev)
- xp-framework/test: ^2.0 | ^1.5
- dev-master
- v9.3.0
- v9.2.0
- v9.1.1
- v9.1.0
- v9.0.0
- v8.17.2
- v8.17.1
- v8.17.0
- v8.16.0
- v8.15.1
- v8.15.0
- v8.14.0
- v8.13.0
- v8.12.0
- v8.11.0
- v8.10.0
- v8.9.0
- v8.8.5
- v8.8.4
- v8.8.3
- v8.8.2
- v8.8.1
- v8.8.0
- v8.7.0
- v8.6.0
- v8.5.1
- v8.5.0
- v8.4.0
- v8.3.0
- v8.2.0
- v8.1.0
- v8.0.0
- v7.3.0
- v7.2.1
- v7.2.0
- v7.1.0
- v7.0.0
- v6.11.0
- v6.10.0
- v6.9.0
- v6.8.3
- v6.8.2
- v6.8.1
- v6.8.0
- v6.7.0
- v6.6.0
- v6.5.0
- v6.4.0
- v6.3.2
- v6.3.1
- v6.3.0
- v6.2.0
- v6.1.1
- v6.1.0
- v6.0.0
- v5.7.0
- v5.6.0
- v5.5.0
- v5.4.1
- v5.4.0
- v5.3.0
- v5.2.1
- v5.2.0
- v5.1.3
- v5.1.2
- v5.1.1
- v5.1.0
- v5.0.0
- v4.3.1
- v4.3.0
- v4.2.1
- v4.2.0
- v4.1.0
- v4.0.0
- v3.0.0
- v2.13.0
- v2.12.0
- v2.11.1
- v2.11.0
- v2.10.1
- v2.10.0
- v2.9.0
- v2.8.0
- v2.7.0
- v2.6.2
- v2.6.1
- v2.6.0
- v2.5.1
- v2.5.0
- v2.4.0
- v2.3.0
- v2.2.0
- v2.1.0
- v2.0.5
- v2.0.4
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0.0
- v1.4.0
- v1.3.0
- v1.2.1
- v1.2.0
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.0
- v0.9.1
- v0.9.0
- v0.8.0
- v0.7.0
- v0.6.0
- v0.5.0
- v0.4.0
- v0.3.0
- v0.2.0
- v0.1.0
- dev-feature/pipelines
- dev-feature/interface-defaults
- dev-feature/instance-method-callable
- dev-feature/unchecked-types
- dev-feature/namespace-constant
- dev-four
- dev-three
- dev-two
This package is auto-updated.
Last update: 2024-09-01 13:02:36 UTC
README
将未来的 PHP 编译成今天的 PHP。
用法
通过在项目中添加编译器 composer require xp-framework/compiler
,它将挂钩到类加载链,并按需编译 .php
文件。这保持了 PHP 典型的代码保存-重新加载/重新运行的开发过程。
示例
以下代码使用 Hack 语言,PHP 8.4、PHP 8.3、PHP 8.2、8.1 和 8.0 功能,但可以在任何 >= PHP 7.4 的环境中运行。如果需要,新版本 PHP 的内置功能将被转换为与当前执行环境兼容。
<?php // In a file "HelloWorld.php" use lang\Reflection; use util\Date; use util\cmd\Console; #[Author('Timm Friebe')] #[Permissions(0o777)] class HelloWorld { private const string GREETING= 'Hello'; public static function main(array<string> $args): void { $greet= fn($to, $from) => self::GREETING.' '.$to.' from '.$from; $author= Reflection::type(self::class)->annotation(Author::class)->argument(0); Console::writeLine(new Date()->toString(), ': ', $greet($args[0] ?? 'World', from: $author)); } }
要在终端窗口中运行此代码,请使用 xp -m /path/to/xp/reflection HelloWorld
。
编译
也可以通过调用编译器显式地执行编译
# Compile code and write result to a class file $ xp compile HelloWorld.php HelloWorld.class.php # Compile standard input and write to standard output. $ echo "<?php ..." | xp compile - # Compile src/main/php and src/test/php to the dist folder. $ xp compile -o dist src/main/php/ src/test/php/ # Compile src/main/php to the dist.xar archive $ xp compile -o dist.xar src/main/php/ # Compile src/main/php, do not write output $ xp compile -n src/main/php/ # Target PHP 7.4 (default target is current PHP version) $ xp compile -t php:7.4 HelloWorld.php HelloWorld.class.php # Emit XP meta information (includes lang.ast.emit.php.XpMeta): $ xp compile -t php:7.4 -a php:xp-meta -o dist src/main/php
-o 和 -n 选项接受多个输入源。-q 选项抑制所有诊断输出,除了错误。
支持的功能
XP 编译器支持诸如注解、箭头函数、枚举、属性类型提示、null 安全实例操作符以及 PHP 7 和 PHP 8 语法添加的所有功能。完整列表包括示例,可以在我们的 Wiki 中找到 这里。
更多功能
可以通过安装来自 这里 的编译器插件添加额外的语法,如 is
操作符、泛型或记录类型。
$ composer require xp-lang/php-is-operator # ... $ xp compile Usage: xp compile <in> [<out>] @FileSystemCL<./vendor/xp-framework/compiler/src/main/php> lang.ast.emit.PHP74 lang.ast.emit.PHP80 lang.ast.emit.PHP81 lang.ast.emit.PHP82 lang.ast.emit.PHP83 [*] lang.ast.emit.PHP84 lang.ast.syntax.php.Using [*] @FileSystemCL<./vendor/xp-lang/php-is-operator/src/main/php> lang.ast.syntax.php.IsOperator
实现状态
新版本 PHP 的一些功能以及 Hack 语言的功能仍然缺失。然而,目标是实现所有功能——除了 Hack 的方向与 PHP 冲突的地方!概述可以在 这个 Wiki 页面 上看到。
要贡献,请打开问题报告和/或拉取请求。