我目前正在构建一个用PHP编写的PHP解析器,因为在我之前的问题中没有出现现有的解析器.该分析器本身运作得相当好.
现在很明显,解析器本身没什么用(除了静态分析).我想将转换应用于AST,然后将其编译回源代码.应用转换不是一个问题,普通的访客模式应该这样做.
我目前的问题是如何将AST编译回源代码.我看到基本上有两种可能性:
现在我想专注于1.因为2.似乎很难完成(但如果你有相关的提示,我想听听它们).
但我不确定哪种设计模式可用于编译代码.我看到实现这一点的最简单方法是->compile向所有节点添加一个方法.我在这里看到的缺点是,更改生成的输出的格式非常困难.人们需要更改节点本身才能做到这一点.因此,我正在寻找一个不同的解决方案.
我听说访客模式也可以用于此,但我无法想象它应该如何工作.据我了解访问者模式,你有一些NodeTraverser在所有节点上递归迭代并调用一个->visit方法Visitor.对于节点操作来说这听起来非常有前景,其中该Visitor->visit方法可以简单地更改它传递的Node,但我不知道它如何用于编译.一个显而易见的想法是将节点树从叶子迭代到根,并用源代码替换访问的节点.但这在某种程度上似乎不是一个非常干净的解决方案?
我有两个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)
有什么方法可以做到这一点吗?
对象解构的确切顺序是什么?
从测试开始,我有一个想法:当前范围的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版本吗?
我有这个:
$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)
如何在爆炸前剥去弦中的第一个和最后一个*?
好的,我们知道以下两行是等价的 -
(0 == i)(i == 0)此外,过去鼓励使用第一种方法,因为如果您不小心使用'='而不是'==',那么编译器就会给出错误消息.
我的问题是 - 在今天的一代漂亮的IDE和智能编译器中,你还推荐第一种方法吗?
特别是,当我看到以下代码时,这个问题突然出现在我脑海中 -
if(DialogResult.OK == MessageBox.Show("Message")) ...
Run Code Online (Sandbox Code Playgroud)
在我看来,我绝不会推荐上述内容.任何第二意见?
我对这个问题犹豫不决,因为它看起来很奇怪.但无论如何.万一有人遇到过同样的问题......文件系统函数(fopem,file,file_get_contents)对于http:// wrapper表现得很奇怪
http://google.com/).http://goog973jd23le.com/)它的行为完全相同,除了少量[假设域查找]超时,之后我没有得到任何错误(应该!)但是空字符串.此错误似乎不适用,因为在我的情况下,它不适用于每个URL或主机.
php-fpm 5.2.11 Linux版本2.6.35.6-48.fc14.i686(mockbuild@x86-18.phx2.fedoraproject.org)
您只需设置新密钥并删除旧密钥即可"更改"数组元素的键:
$array[$newKey] = $array[$oldKey];
unset($array[$oldKey]);
Run Code Online (Sandbox Code Playgroud)
但是这会将键移动到数组的末尾.
是否有一些优雅的方式来改变密钥而不改变顺序?
(PS:这个问题仅仅是出于概念上的兴趣,而不是因为我在任何地方都需要它.)
$binary = b'Binary string';
Run Code Online (Sandbox Code Playgroud)
创建一个字符串作为binary 有什么后果?
我在文档中找不到任何关于它的提示.通过language_scanner查看这个小小的好奇心.