PHP将字符串编译为字节码而不对其进行评估

Posted

技术标签:

【中文标题】PHP将字符串编译为字节码而不对其进行评估【英文标题】:PHP compile string to bytecode without evaling it 【发布时间】:2018-01-03 00:00:23 【问题描述】:

Python(至少是 CPython 和 Jython,可能是所有 Python)有一个名为 compile 的函数,可用于将文件编译为字符串或字节码对象。

# foo.py
a = compile("""
print(47)
""", filename="testfile", mode="exec")

exec(a)

运行foo.py 产生:

$ python foo.py
47

php(特别是 Zend,任何版本)是否以类似的方式向用户代码公开其字节码编译器?更具体地说,您可以动态编译字符串而不像eval 那样执行它们吗?

【问题讨论】:

类似:php.net/manual/en/book.bcompiler.php 不是没有像上面这样的扩展,但是因为 python 中的 exec 就像 PHP 中的 eval 一样,你可以创建一个 compile() 函数来返回你给它的内容:/,传递它 PHP 代码并返回相同的字符串,将其存储在变量中,然后使用 eval。所以本质上和你用 python 做的一样。您可以将 php 存储在您知道的变量中吗? 【参考方案1】:

我不知道,但您向我展示的内容对您可以即兴创作的替代方案非常熟悉:

foo.php

<?php
    print(47);
?>

index.php

<?php
    include('foo.php');
?>

eg: so in windows cmd下的php cli:

在任何文件夹中,您都有 index.php 和 foo.php,其中 xampp 来自 apachefriends.org,安装在 c:\xampp create runme.bat 中

@echo off
set parameter=%1
set PHP_BIN="c:\xampp\php\php.exe"
%PHP_BIN% %parameter%

所以你可以从 cmd 调用 index.php 的非常简单的 cli 解释:

runme index.php

也 runme foo.php 有相同的结果,我放 index.php 的唯一原因是将它用作我存储的某种数组列表之间的“代理”,并且不仅包括 foo.php 还包括许多其他并且通过这种方式可以成为一种没有太多修改的“控制器”(如果问题指向某种控制器按任何顺序排序的代码执行)

47

【讨论】:

【参考方案2】:

如果你想知道PHP是否有编译PHP代码的compile内置函数,没有。 PHP是一种解释型语言,PHP代码需要解释器来运行,而解释器有它的执行环境。

但是如果你想实现你的需求,这里有一些方法可以实现它:

    PHC

phc 是一个支持插件的 PHP 开源编译器。此外,它还可用于漂亮打印或混淆 PHP 代码,作为开发处理 PHP 脚本的应用程序的框架,或将 PHP 转换为 XML 并返回,从而可以使用 XML 工具处理 PHP 脚本。

    bcompiler

在专有的 PHP 应用程序中编码整个脚本 在专有的 PHP 应用程序中编码一些类和/或函数 启用可在客户端桌面上使用的 php-gtk 应用程序的生产,而无需 php.exe。 做一个 PHP 到 C 转换器的可行性研究

3.Project Zero

支持PHP编译

【讨论】:

以上是关于PHP将字符串编译为字节码而不对其进行评估的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Python 在编译为字节码之前不评估常数算术?

将 Ruby 2.1 编译为字节码

Python 文件编译为字节码的方法

如何在 PHP 中获取字符串的字节值?

深度详解JVM类字节码

如何执行汇编操作码而不将其存储到缓冲区 c/python 中?