覆盖默认的php函数? (EVAL)

时间:2011-08-03 19:32:39

标签: php


我们可以使用以下代码简单地覆盖默认的php函数:

namespace blarg;
function time() {
  echo "test !";
}
time();

但是!是否可以覆盖“eval”功能?

namespace blarg;
function eval() {
echo "test !";
}
eval();


提前谢谢

根据回答:

  1. eval()是一种语言结构,而不是一种功能,我们无法覆盖它 2.在我的例子中,我没有真正覆盖time()函数。我只是创建一个blarg \ time()函数

  2. 我明白了 的 BUT
    实际上我像写一个调试器,我需要改变php functons或某些语言结构的默认行为(例如eval) 反正有没有这样做? 是否可以更改php源并进行编译? (是否有任何特定文件要编辑?)

2 个答案:

答案 0 :(得分:3)

注意:因为这是一种语言结构而不是函数,所以无法使用变量函数调用它Manual

因此,它不能被覆盖为echo / php / include

答案 1 :(得分:1)

namespace blarg;
function time() {
  echo "test !";
}
time();

这不会覆盖内置time()函数。这样做是创建函数blarg\time() - 也就是说,time()blarg\time()都存在且可以被调用,所以从来没有被time()覆盖。

当您在time()命名空间中调用blarg时,内置time()和本地blarg\time()函数都是要调用的候选函数;但是,PHP将通过始终调用最本地名称来消除歧义,在本例中为blarg\time()

现在,如果我们问是否可以引入一个名为eval()的本地函数,答案是否定的,因为eval是PHP语言中的保留字,因为它具有特殊含义 - 被称为语言结构。其他相同性质的示例包括issetemptyincluderequire