【问题标题】:Override default php function覆盖默认的php函数
【发布时间】:2010-10-13 21:04:56
【问题描述】:

我有一个脚本,其中 basename() 被使用了 100-1000 秒,我只是想我们是否可以覆盖该函数,而不是在所有脚本中将函数名称更改为其他名称。

basename() 的问题在于它不适用于外文文件名。我在 php 网站 http://php.net/manual/en/function.override-function.php 上找到了一个,但它需要 PECL 任何其他选择吗?

【问题讨论】:

  • 在相关说明中,如果效果不佳,请在bugs.php.net提交错误报告
  • @Artefacto,有时他们不能仅仅因为向后兼容问题而改变它。

标签: php function overriding


【解决方案1】:

您可以使用命名空间来覆盖现有的函数名称:

namespace blarg;
function basename() {
  return 'whatever';
}
$base = basename();

即,在 blarg 命名空间中对 basename() 的任何调用都将使用您的新版本的函数。

【讨论】:

  • 请记住,命名空间仅在 PHP 5.3 及更高版本中受支持。
  • 尝试以其他方式覆盖函数将导致“函数已存在”错误。缺少 5.3:创建一个函数xbasename(),它封装了真正的 basename 函数以及另一种处理非 ansi 字符的方法。然后,CTRL-A & CTRL-H……我相信每个人都知道其余的。
  • 有时覆盖实现需要调用原始函数。在这个例子中,有没有办法从新的 basename 调用原始的 basename ?
  • 在函数名前加上反斜杠,表示您希望在根命名空间中使用该函数名:\basename();
  • 谢谢@Alex。我现在正在尝试在其他 php 文件中使用此功能。我首先尝试了 'require_once('overridebasename.php');使用 blarg.basename; '顺便说一句,whihc 不起作用。但无论如何,如果我想覆盖几个函数,这会很痛苦。有没有办法在 require_once 之后注入所有覆盖的函数?注意:从每个带有 'namespace blarg; 的文件开始; require_once 'overridebasename.php';做到这一点,但会影响文件的命名空间。
【解决方案2】:

另一种选择是runkit。但这不太可能在大多数服务器上启用。

【讨论】:

    【解决方案3】:

    您可以在调用 basename 之前更改语言环境:

    setlocale(LC_ALL, 'en_US.UTF8');
    

    setlocale

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多