小编Nik*_*kiC的帖子

将AST编译回源代码

我目前正在构建一个用PHP编写的PHP解析器,因为在我之前的问题中没有出现现有的解析器.该分析器本身运作得相当好.

现在很明显,解析器本身没什么用(除了静态分析).我想将转换应用于AST,然后将其编译回源代码.应用转换不是一个问题,普通的访客模式应该这样做.

我目前的问题是如何将AST编译回源代码.我看到基本上有两种可能性:

  1. 使用某种预定义方案编译代码
  2. 保留原始代码的格式并仅在已更改的节点上应用1.

现在我想专注于1.因为2.似乎很难完成(但如果你有相关的提示,我想听听它们).

但我不确定哪种设计模式可用于编译代码.我看到实现这一点的最简单方法是->compile向所有节点添加一个方法.我在这里看到的缺点是,更改生成的输出的格式非常困难.人们需要更改节点本身才能做到这一点.因此,我正在寻找一个不同的解决方案.

我听说访客模式也可以用于此,但我无法想象它应该如何工作.据我了解访问者模式,你有一些NodeTraverser在所有节点上递归迭代并调用一个->visit方法Visitor.对于节点操作来说这听起来非常有前景,其中该Visitor->visit方法可以简单地更改它传递的Node,但我不知道它如何用于编译.一个显而易见的想法是将节点树从叶子迭代到根,并用源代码替换访问的节点.但这在某种程度上似乎不是一个非常干净的解决方案?

php compiler-construction abstract-syntax-tree

30
推荐指数
1
解决办法
9053
查看次数

PHP变量,方法,类等名称中的有效字符是什么?

在变量,常量,函数,方法,类等的PHP名称中可以使用哪些有效字符?

手动有一些 提到的正则表达式[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.这个限制什么时候适用,什么时候不适用?

php

30
推荐指数
1
解决办法
1万
查看次数

我在哪里可以了解PHP内部?

有什么好的资源可以开始学习PHP和Zend Engine的内部结构?

php php-internals

27
推荐指数
2
解决办法
5875
查看次数

包括php的另一台服务器的php文件

我有两个PHP文件位于不同的服务器上,一个在http://www.mysite.com/main.php,另一个在http://www.sample.com/includeThis.php.

我想要包含第一个文件.

第二个文件的内容如下所示:

<?php
$foo = "this is data from file one";
Run Code Online (Sandbox Code Playgroud)

第一个文件:

<?php
include "http://www.sample.com/includeThis.php";
echo $foo;
Run Code Online (Sandbox Code Playgroud)

有什么方法可以做到这一点吗?

php file include

25
推荐指数
2
解决办法
5万
查看次数

在PHP中破坏对象的顺序是什么?

对象解构的确切顺序是什么?

从测试开始,我有一个想法:当前范围的FIFO.

class test1
{
    public function __destruct()
    {
        echo "test1\n";
    }
}

class test2
{
    public function __destruct()
    {
        echo "test2\n";
    }
}

$a = new test1();
$b = new test2();
Run Code Online (Sandbox Code Playgroud)

它会一次又一次地产生相同的结果:

test1
test2
Run Code Online (Sandbox Code Playgroud)

PHP手册是模糊的(重点煤矿突出不确定度):"为有特定对象的任何其它引用的析构函数方法将被立即调用,或者在关断期间,任何顺序 ".

解构的确切顺序是什么?任何人都可以详细描述PHP使用的销毁顺序的实现吗?而且,如果这个顺序在任何和所有PHP版本之间不一致,那么任何人都可以查明这个订单改变的PHP版本吗?

php php-internals

25
推荐指数
2
解决办法
3518
查看次数

从string中删除第一个和最后一个char

我有这个:

$dataList = "*one*two*three*";
$list = explode("*", $dataList);
echo"<pre>";print_r($list);echo"</pre>";
Run Code Online (Sandbox Code Playgroud)

哪个输出:

> Array (
>     [0] => 
>     [1] => one
>     [2] => two
>     [3] => three
>     [4] =>  )
Run Code Online (Sandbox Code Playgroud)

如何在爆炸前剥去弦中的第一个和最后一个*?

php trim

23
推荐指数
4
解决办法
3万
查看次数

如何检查等于?(0 == i)或(i == 0)

好的,我们知道以下两行是等价的 -

  1. (0 == i)
  2. (i == 0)

此外,过去鼓励使用第一种方法,因为如果您不小心使用'='而不是'==',那么编译器就会给出错误消息.

我的问题是 - 在今天的一代漂亮的IDE和智能编译器中,你还推荐第一种方法吗?

特别是,当我看到以下代码时,这个问题突然出现在我脑海中 -

if(DialogResult.OK == MessageBox.Show("Message")) ... 
Run Code Online (Sandbox Code Playgroud)

在我看来,我绝不会推荐上述内容.任何第二意见?

c c++ coding-style

22
推荐指数
8
解决办法
9138
查看次数

file_get_contents返回空字符串

我对这个问题犹豫不决,因为它看起来很奇怪.但无论如何.万一有人遇到过同样的问题......文件系统函数(fopem,file,file_get_contents)对于http:// wrapper表现得很奇怪

  • 它似乎有效.没有错误提出.fopen()返回资源.
  • 它不返回所有肯定工作的URL的数据(例如http://google.com/).
    file返回空数组,file_get_contents()返回空字符串,fread返回false
  • 对于所有故意错误的URL(例如http://goog973jd23le.com/)它的行为完全相同,除了少量[假设域查找]超时,之后我没有得到任何错误(应该!)但是空字符串.
  • url_fopen_wrapper已开启
  • curl(命令行和php版本)工作正常,所有其他实用程序和应用程序工作正常,本地文件打开正常

此错误似乎不适用,因为在我的情况下,它不适用于每个URL或主机.

php-fpm 5.2.11 Linux版本2.6.35.6-48.fc14.i686(mockbuild@x86-18.phx2.fedoraproject.org)

php fopen

21
推荐指数
3
解决办法
5万
查看次数

更改数组键而不更改顺序

您只需设置新密钥并删除旧密钥即可"更改"数组元素的键:

$array[$newKey] = $array[$oldKey];
unset($array[$oldKey]);
Run Code Online (Sandbox Code Playgroud)

但是这会将键移动到数组的末尾.

是否有一些优雅的方式来改变密钥而不改变顺序?

(PS:这个问题仅仅是出于概念上的兴趣,而不是因为我在任何地方都需要它.)

php arrays

21
推荐指数
3
解决办法
7310
查看次数

字符串文字前面的b有什么作用?

$binary = b'Binary string';
Run Code Online (Sandbox Code Playgroud)

创建一个字符串作为binary 有什么后果?

我在文档中找不到任何关于它的提示.通过language_scanner查看这个小小的好奇心.

php string syntax

20
推荐指数
1
解决办法
6064
查看次数