有没有办法在PHP中覆盖/重命名/重新映射功能?

时间:2010-07-28 15:01:29

标签: php

我知道在C ++或Obj-c等其他语言中甚至可以(在运行时和编译时),但是有没有办法在php中覆盖/重命名/重映射功能?所以我的意思是,假设我们想要替换mysql_query的实现。这可能吗?

SOME_REMAP_FUNCTION(mysql_query, new_mysql_query);

//and then you define your new function
function new_mysql_query(blah...) {
  //do something custom here
  //then call the original mysql_query
  mysql_query(blah...)
}

这样,其余的代码可以透明地调用mysql_query函数,而不知道我们在中间插入了一些自定义代码。

7 个答案:

答案 0 :(得分:2)

我相信如果你使用命名空间,你可以编写一个具有相同名称的新函数,并以这种方式“欺骗”系统。这是我在...上阅读的一篇简短的博客。

http://till.klampaeckel.de/blog/archives/105-Monkey-patching-in-PHP.html

答案 1 :(得分:2)

正如ianhales所说,您可以使用APD扩展程序或runkit来执行此操作 这两个扩展都有许多其他有用的功能,但如果你将它们应用于面向互联网的网络服务器,它们都会以奇怪和异国情调的方式破坏你的系统。

更好的解决方案是在部署代码时重新编写代码(这可以自动完成,例如使用sed),也许可以使用auto_prepend。

下进行。

答案 2 :(得分:0)

不是从PHP.net下载的PHP。虽然有一个扩展允许这样做。

如果这些是你正在使用的mysql函数,那么最好考虑扩展mysqli类。

答案 3 :(得分:0)

http://php.net/manual/en/function.override-function.php 这可能有一些用处。最高评论听起来与您发布的示例完全相同。它确实使用了PECL扩展。

答案 4 :(得分:0)

更好的想法是从一开始就使用抽象层,例如PDO。 PDO附带PHP 5.1及更高版本,可作为PHP 5.0.x的PECL扩展。

答案 5 :(得分:0)

如果你在课堂上有功能。我们可以从继承它的其他类中覆盖它。

实施例

class parent {
    function show() {
        echo "I am showing";
    }
}

class mychild extends parent {
    function show() {
        echo "I am child";
    }
}

$p = new parent;
$c = new mychild;

$p->show(); //call the show from parent
$c->show(); //call the show from mychild

答案 6 :(得分:0)

为什么不将函数包装在命名空间中?

namespace MySQL
{
    function connect()
    {
         //Blah
    }
}

然后像这样使用:

<?php

mysql_connect(); //Native Version
MySQL\connect(); //Your Version