【问题标题】:How do I rewrite PHP code blocks before they are passed to the interpreter?如何在将 PHP 代码块传递给解释器之前重写它们?
【发布时间】:2013-07-27 21:48:01
【问题描述】:

我想要做的是为 PHP 编写一个解析器来解释空格而不是括号。我可以重写位并输出 PHP,但我不确定如何最好地将其集成到应用程序中。

在一个理想的世界里,我想最好的办法是在文件的顶部放置一个包含,这反过来将所有跟随它的代码块重写为正确的 PHP 语法,因为它们被传递给解释器,但是我不知道可以通过这种方式传递代码块。

另一种选择是将其编写为服务器扩展,但我不希望这样做,因为它会降低访问性。

有没有一种简单的方法来构建这个?

【问题讨论】:

  • 这样的扩展已经存在并且被称为“Python”,虽然它根本不使用 PHP。实际上,您正在尝试构建不兼容的 PHP 语言版本。如果确实需要,请编写一个预编译器,将您的 WHITESPACE-PHP 版本转换为常规 PHP,然后再发布此类代码或将其放入任何服务器。
  • 万岁为将 php 带入未来所做的史诗般的努力。不幸的是,我无法为您提供建议 - 也许 facebook hiphop 项目(将 php 编译为 c++)会有所帮助(尽管有所不同)。在我使用的空白语言中:python,我可以用装饰器来做,但我不认为 PHP 有这个功能
  • 看看 ircmaxell 的PHPPHP 中一个用 PHP 编写 PHP 解析器的例子
  • 嘿Sven-我的方法类似于coffeescript;最终,只是表面上的变化。语言在结构上将保持不变。

标签: php


【解决方案1】:

Stream Wrappers 有办法做到这一点。

有了它,您基本上可以读取和重写 PHP 读取的任何代码在实际被解释之前。与fopen()、fwrite()、include、require、file_get_contents() 等。

因此,在您的情况下,您可以侦听 require(_once) 或 include(_once) 的任何文件并使用您喜欢的代码。您将在一个变量中获取整个代码,然后您可以简单地使用正则表达式对字符串进行各种替换。

唯一的缺点是,您的 index.php 无法使用此方法,因为它被任何 include 或 require 捕获.但是从那里包含的任何其他代码文件都可以被stream wrapper 捕获。

这是一篇关于使用该方法的插件系统的文章。也许它可以提供任何帮助。

http://phpmyweb.net/2012/04/26/write-an-awesome-plugin-system-in-php/

您还可以在其中找到一个指向带有插件代码源的guthub 页面的链接。在那里你基本上可以看到如何设置你的Stream Wrapper 类。从那里您可以编写自己的代码,因为您不必像插件那样拦截任何方法调用等。

【讨论】:

  • 你知道,我想可能就是这样。 index.php 的限制不是什么大问题,我认为这是可以接受的。我会仔细看看这里的源代码,但它看起来很有希望!谢谢!
【解决方案2】:

我认为您的包含想法不会像描述的那样起作用。由于代码会缺少大括号,因此它可能无法通过普通的 PHP 解析器而不抛出 500 错误。所以你想要包含的文件永远无法完成它的工作。

相反的方法可能会奏效。编写解析器脚本并让它读取并执行您的“空白”PHP 文件。

网址可能如下所示:mydomain.com/my-parsing-script.php?file=script/to/parse.php

然后您将编辑 .htaccess 以重写所有 URL 以使这些内容对用户不可见。

解析脚本将简单地打开“空白”文件并在将脚本传递给 eval() 之前执行一些正则表达式魔术;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2023-01-24
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    相关资源
    最近更新 更多