繁体   English   中英

有可能扩展php功能吗?

[英]it is possible to extend a php function?

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

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

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

没有。

你可以扩展一个类方法并调用parent::methodname()来运行前面的代码(这几乎就是你要求的),但是对于普通函数,没有办法做到这一点。

有一些深奥的PHP扩展允许覆盖功能,但我认为这不是你需要的,它们的使用很少实用。

您可能想要做的是创建一个新函数,并调用其中的现有函数。

不,你做不到。 启用MySql查询日志或将执行查询的代码包装到Logging Decorator中,或使用Zend_Db之类的抽象,可以使用Profiler或使用透明日志插件来实现mysqlnd

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

您需要编写一个将接受查询的函数,首先记录sql,运行查询,然后返回结果。

例如

<?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;

}

这不是扩展函数,但是你只能扩展一个类

这是不可能的。

您应该已经创建了自己的API(或使用现有的API)来访问数据库,因此当您需要日志记录时,您可以简单地增强自己的API函数。 如果您需要一些自定义错误处理功能,它也非常方便。 重构代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM