jchook/phpp

PHP 预处理器,支持类似 C 的 #include 指令

v1.0.0-rc2 2021-08-28 02:32 UTC

This package is not auto-updated.

Last update: 2024-09-22 15:42:38 UTC


README

使用 #include 指令编写 PHP 模板,这些指令类似于由 C 预处理器处理的指令。

还可以可选地评估 <?php ?> 块。

安装

如果您想使用 composer

composer require-dev jchook/phpp

下载 phar 并将其包含在项目中

示例

创建一个可以包含类似于 cpp 的 #include 指令和/或 PHP 模板的文件。

Dockerfile.in

FROM alpine:3.14

#include "php.dockerfile"
#include "runit.dockerfile"

然后运行脚本构建它,类似于 cpp。

phpp -o Dockerfile Dockerfile.in

命令行使用

USAGE

  phpp [options] PATH...

OPTIONS

  -h, --help  Show this help info
  -o PATH     Output processed file to PATH. (multi)
  -I PATH     Look here for included files (multi)
  --ext       Look for files with this extension (multi)
  --eval      Evaluate PHP in included files
  -v          Verbose mode

标记为 (multi) 的选项可以多次调用。

PHP 接口

请参阅源代码以获取更多信息。以下是一个简单的示例

<?php

use Jchook\Phpp\Preprocessor;

$pre = new Preprocessor();
$pre->makeFile('Dockerfile.in');

动机

Dockerfile 不允许您 INCLUDE 其他 Dockerfile。这是一个 已知并被接受的限制

有人建议 使用 cpp 来转换 #include 指令,但这存在一些关键问题

  • 不能使用正常的 # 注释,因为 ccp 会引发错误
  • cpp 手册警告说不要将其用于非 C 代码

这个工具利用 PHP(一种强大的图灵完备模板语言)提供了一个完整的模板解决方案,并具有熟悉的 #include 快捷方式。

为什么不使用普通的 PHP 呢?

考虑以下两个在 Dockerfile 中并排的示例

# PHP include:
#<?php include __DIR__ . '/thing.dockerfile' ?>

# CPP-like include
#include "thing.dockerfile"

仅使用 "PHP" 会呈现一些尴尬的怪癖

  • 理想情况下,您可以取消注释 include 行以避免在代码编辑器/IDE 中引发语法错误或奇怪的突出显示问题。

  • 取消注释 include 行意味着被包含文件的第一行将被取消注释。

  • 没有自动的纸迹显示输出文件中哪些代码来自哪个包含。

  • 更复杂的语法,需要更多的显式包含路径。

注意事项

如果您的 Dockerfile 或类似代码中包含字符串 <?php,PHP 将会解释它。如果您不希望这种行为,请确保至少转义一个字符或禁用 eval 模式。