我的问题是,是否可以扩展声明的函数。
我想扩展mysql_function以添加mysql查询,将一些日志插入表中:'query' - mysql_query,date,page ...等参数
答案 0 :(得分:6)
我的问题是,是否可以扩展声明的函数。
没有。
你可以扩展一个类方法并调用parent::methodname()
来运行前面的代码(几乎你所要求的),但对于正常的函数,没有办法做到这一点
有一些深奥的PHP扩展允许覆盖功能,但我认为这不是你需要的,它们的使用很少实用。
您可能想要做的是创建一个新函数,并调用其中的现有函数。
答案 1 :(得分:2)
不,你不能这样做。启用MySql Query Logs或将执行查询的代码包装为Logging Decorator或使用Zend_Db that can take a Profiler之类的抽象或使用transparent logging plugin for mysqlnd
答案 2 :(得分:0)
您需要编写一个函数来接收查询,首先记录sql,运行查询,然后返回结果。
E.G
<?php
function mysql_query_log($sql)
{
mysql_query('insert into .... values ...');
$r = mysql_query($sql);
$results;
//do the normal thing you do with mysql here
return $results;
}
这不是扩展功能,但你只能扩展一个类
答案 3 :(得分:0)
这是不可能的。
您应该已经创建了自己的API(或使用现有的API)来访问数据库,因此当您需要记录时,您可以简单地增强自己的API功能。如果您需要一些自定义错误处理功能,它也非常方便。重构代码。
答案 4 :(得分:0)
答案 5 :(得分:0)
来自http://php.net/manual/en/function.rename-function.php
bool rename_function(string $ original_name,string $ new_name)
在全局函数表中将orig_name重命名为new_name。有用 用于暂时覆盖内置函数。
我相信如果你将原始文件重命名为original_mysql_query,那么添加你的替换函数来执行你的日志记录然后调用original_mysql_query等,你将实现你的目标,假设你有办法在每个页面上注入重命名将调用MySQL_query。大多数大型网站都有公共代码,这些代码包含在每个页面的顶部,可以为您完成。
还有一个内置的php函数,名为override_function(由ChrisH提及)。它没有在php手册页中完整记录,但是如果您更喜欢rename_function函数,那么doc下面的用户注释会为您提供使用它所需的信息。如果您需要从替换中调用原始函数,则会讨论限制为一个覆盖。使用rename_function而不是override函数可以消除这种潜在的限制。