【问题标题】:Override a default php function ? (eval)覆盖默认的 php 函数? (评估)
【发布时间】:2011-08-03 19:32:38
【问题描述】:


我们可以使用以下代码简单地覆盖默认的 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 源并编译它? (有没有要编辑的特定文件?)

【问题讨论】:

  • eval() 是一种语言结构,而不是一个函数,你不能覆盖它。
  • 您并没有真正覆盖示例中的 time() 函数。你只是在创建一个blarg\time() 函数。
  • 这是类似的 SO 问题 - stackoverflow.com/questions/2326835/…

标签: php


【解决方案1】:

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

所以,它也不能被覆盖为 echo/php/include

【讨论】:

  • 这个,+1。但是请注意include 部分,您当然可以使用自己的流包装器覆盖file:// 协议...
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2017-04-21
    • 1970-01-01
    相关资源
    最近更新 更多