我知道在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函数,而不知道我们在中间插入了一些自定义代码。
答案 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