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将字符串编译为字节码而不对其进行评估的主要内容,如果未能解决你的问题,请参考以下文章