有可能扩展php功能吗?

时间:2011-09-16 11:10:37

标签: php mysql logging

我的问题是,是否可以扩展声明的函数。

我想扩展mysql_function以添加mysql查询,将一些日志插入表中:'query' - mysql_query,date,page ...等参数

6 个答案:

答案 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函数可以消除这种潜在的限制。