PHP内部开发问题,希望扩展带有引用功能的curly语法

PHP内部开发问题,希望扩展带有引用功能的curly语法,php,customization,php-7.4,Php,Customization,Php 7.4,我知道这有点离题,因为我没有代码,我的问题是抽象的 我想在PHP语言中添加一个功能: 现有功能: $var=123; $string = "This is a {$var} variable"; 需要SQL变量的新功能: $var="asd' union ()"; $string = "This is a {(QUOTE)$var} quoted variable"; 或: 其思想是扩展字符串卷曲语法,以支持函数或某些硬编码函数引用变量 我的问题是: 有没有办法编写一个php模块/扩展来提供

我知道这有点离题,因为我没有代码,我的问题是抽象的

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

$var=123;
$string = "This is a {$var} variable";
需要SQL变量的新功能:

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

其思想是扩展字符串卷曲语法,以支持函数或某些硬编码函数引用变量

我的问题是:
有没有办法编写一个php模块/扩展来提供这样的功能?
如果是这样的话,我需要从哪里快速开始

解决方案

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

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

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

如果你好奇的话,你可以。尽管我认为有一个比试图修改整个PHP语言更容易解决SQL中转义字符串的直接问题的解决方案


在这个答案中,对PHP解析器如何工作的内部进行更详细的解释将是详尽无遗的。这就是为什么我要链接到我所知道的关于这个问题的技术上最正确的解释


重要旁注 需要明确的是,这个不能是一个扩展。您没有扩展PHP。你真的在改变它。因为PHP解析器必须从自身编译(是的,我们编译编译器),所以不能简单地提供一个共享对象来完成这项工作。您必须从头开始构建整个PHPSRC树,包括解析器本身(通常是用php预先打包的)

这样做的结果是,您现在已经分叉了自己的PHP语言实现,它不再与事实上的PHP兼容

换句话说。。。你一辈子都拥有它


请使用准备好的SQL语句。另外,请阅读以下内容:

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

为了更专注于你的问题,在你的定制中使用诸如胡须、分叉和分层之类的东西可能更容易实现你想要的


我非常怀疑您是否能够构建一个模块来提供这种功能。大多数模块都提供了非常具体/独立的附加功能。我想不出一个模块可以修改母语结构的行为。要做到这一点,您需要修改PHP核心本身,这意味着编写一些C语言,然后部署一个与其他任何语言都不兼容的PHP版本。

为什么?你应该使用准备好的语句,这是没有必要的。因为我希望这样,我不喜欢准备好的语句或预引用的字符串。那么为什么不把它抽象成一个函数呢?您可以解析字符串,找到所需的函数和变量,在内存中动态执行操作,然后将结果传递到准备好的语句中,而无需直接接触准备好的语句。您还可以避免维护一个潜在危险的扩展,该扩展可能会因PHP的任何新版本而中断。像
createStatement('This is A{QUOTE($var)}quoted variable')这样的函数是非常合理的。
需要明确的是,这不能是一个扩展。您没有扩展PHP。你真的在改变它。因为PHP解析器必须从自身编译(是的,我们编译编译器),所以不能简单地提供一个共享对象来完成这项工作。您必须从头开始构建整个php src树,包括解析器本身(通常是用php预先打包的)。@B.Fleming我确实在这样做,尽管它需要性能,因为它必须防止解析器注入。(假设$var包含字符“')}”,检测和处理它需要一些开销)要使性能达到要求,它需要作为外部模块写入。我认为直接在PHP语法中使用它会更优雅。谢里夫:谢谢,我担心这就是问题所在。我来自一个不同于用PHP编写的一般sql代码的世界,我处理的文件包含数百个不同的查询。参数化的代码是膨胀的,当一行代码可以做到这一点时,你会突然有10行代码。与处理大数据时sql server内部的性能问题相比,它的性能优势无关紧要。如果引用得当,就没有安全效益。目前,我使用自己的解析器,基本上实现了我想在PHP内部实现的功能。一些傻瓜在这里给出了所有答案-1,对不起。谢谢你的回复即使是你的旁注,我也不会走那条路;)这就是我问的时候害怕的。
function _quote($v) { return strtoupper($v); }
$_Q = '_quote';
$string = "This is an {$_Q($var)} integer";
echo $string;