PHP 内部开发问题,想用引用功能扩展 curly 语法

PHP internal development question, want to extend the curly syntax with quoting functionality

鉴于我没有代码而且我的问题很抽象,我知道这有点离题。

我想在 PHP 语言中添加一个功能:
现有功能:

$var=123;
$string = "This is a {$var} variable";

需要 SQL 个变量的新功能:

$var="asd' union ()";
$string = "This is a {(QUOTE)$var} quoted variable";

或者:

$var="asd' union ()";
$string = "This is a {QUOTE($var)} quoted variable";

想法是扩展字符串 curly 语法以支持函数或一些硬编码函数来引用变量。

我的问题是:
有没有办法编写一个 php module/extension 来提供这样的功能?
如果是这样,我必须在哪里寻找才能快速开始?

解决方案

function _quote($v) { return strtoupper($v); }
$_Q = '_quote';
$string = "This is an {$_Q($var)} integer";
echo $string;

我想这最接近我想要的,而无需破解 php 本身

一般来说,您提供的用例是最没有用的,因为无论如何您都应该使用参数化查询。你可能在解决了错误的问题之后。但是,要扩展语言本身,就必须修改解析器。这需要了解 YACC and C 以及一些 PHP 内部知识。在您的情况下,这绝不是一件微不足道的事情,特别是因为您不仅要修改 PHP 解析字符串的方式,还要修改它编译需要函数执行的操作码的方式。

如果您有兴趣,可以read a detailed blog post on how to approach your idea in Nikita's blog。尽管我认为对于您在 SQL 中转义字符串的直接问题,比尝试修改整个 PHP 语言更容易解决。


在此答案中对 PHP 解析器的工作原理进行更详细的解释将是详尽无遗的。这就是为什么我链接到我所知道的问题的技术上最正确的解释。


Important side note

Just to be clear this cannot be an extension. You aren't extending PHP. You are literally changing it. Because the PHP Parser has to be compiled from itself (yes, we compile the compiler), you can't simply provide a shared object to do this. You have to build the entire php-src tree from scratch including the parser itself (which is prepackaged with php normally).

The consequence of this is that you have now forked your own implementation of the PHP language that is no longer compatible with defacto PHP.

In other words... you own it for life.

请为 SQL 使用准备好的语句。另外,请阅读:https://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/

不喜欢准备好的语句并不是不使用它们的理由,相反,也许可以找到一个可以更好地处理它们的可信库,以不同的方式处理它们,或者甚至可以切换到 ORM。

为了更专注于您的问题,使用 Mustache 之类的东西,将其分叉并在您的自定义中分层,可能会更容易完成您想要的。 https://github.com/bobthecow/mustache.php

我非常怀疑您能否构建一个模块来提供此类功能。大多数模块提供非常 specific/isolated 的附加功能。我想不出一个模块可以修改本地语言构造的行为方式。为此,您需要修改 PHP Core 本身,这意味着编写一些 C,然后部署一个与其他任何东西都不兼容的 PHP 版本。