覆盖默认的 PHP 函数?(eval)

4
我们可以通过以下代码简单地覆盖默认的PHP函数:


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

但是!有没有可能覆盖“eval”函数?
namespace blarg;
function eval() {
echo "test !";
}
eval();

?

谢谢您的帮助

根据回答:

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

我理解了
但是
实际上我正在编写类似于调试器的东西,我需要更改 php 函数或某些语言结构(例如 eval)的默认行为。 是否有任何方法可以做到这一点? 是否可以更改 php 源代码并进行编译?(是否有任何特定的文件需要编辑?)


3
eval() 是一种语言结构而不是函数,你不能覆盖它。 - Karolis
1
你的例子中并没有真正覆盖time()函数。你只是创建了一个blarg\time()函数。 - Mchl
这里有一个类似的SO问题 - https://dev59.com/MXE95IYBdhLWcg3wY9H6 - Rakesh Sankar
2个回答

3

注意:由于这是一种语言结构而不是函数,因此无法使用变量函数进行调用手册

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


2
这个,+1。关于include部分的说明,你当然可以使用自己的流包装器来覆盖file://协议... - Wrikken

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

这并不会覆盖内置的time()函数。它所做的是创建blarg\time()函数,也就是说,time()blarg\time()都存在且可以被调用,因此time()从未被覆盖。

当在blarg命名空间中调用time()时,内置的time()和本地的blarg\time()函数都有可能被调用;但是,PHP将通过始终调用最局部的名称来消除歧义,在这种情况下是blarg\time()

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接