【问题标题】:it is possible to extend a php function?可以扩展一个php函数吗?
【发布时间】:2011-11-18 14:50:29
【问题描述】:

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

我想扩展 mysql_function 以添加 mysql 查询,该查询将一些日志插入表中:'query' - mysql_query、日期、页面...等的参数

【问题讨论】:

  • 为什么会出现扩展问题?为什么不定义一个使用该功能并实现您想要的功能的功能。
  • 写一个自定义函数...会比触摸 php 内核更痛苦...
  • 为此,你最好在插入/更新/删除时创建触发器
  • 我有一个运行简单 mysql_query 函数的网站。现在我想在简单的解决方案中将日志记录在每个查询上,而无需更改所有代码。对于这个网站,我没有实现任何个人课程。
  • 您尚未接受答案。您能否澄清您在答案中寻找的内容以及为什么给定的答案不让您满意。

标签: php mysql logging


【解决方案1】:

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

没有。

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

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

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

【讨论】:

  • 我有一个运行简单 mysql_query 函数的网站。现在我想在简单的解决方案中将日志记录在每个查询上,而无需更改所有代码。对于这个网站,我没有实现任何个人课程。
  • @user 我明白了。除非您可以使用 Gordon 提供的任何方法,否则恐怕我认为您无法编写自定义函数。
【解决方案2】:

不,你不能那样做。启用MySql Query Logs 或将执行查询的代码包装到Logging Decorator 或使用Zend_Db that can take a Profiler 之类的抽象或使用transparent logging plugin for mysqlnd

【讨论】:

    【解决方案3】:

    您需要编写一个函数来接受您的查询,首先记录 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;
    
    }
    

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

    【讨论】:

    • 插入到日志表时不要忘记转义你的sql。
    【解决方案4】:

    这是不可能的。

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

    【讨论】:

    • 我有一个运行简单 mysql_query 函数的网站。现在我想在简单的解决方案中将日志记录在每个查询上,而无需更改所有代码。对于这个网站,我没有实现任何个人课程。
    • 您必须封装以后可能会更改的所有内容(添加日志记录、错误处理、身份验证等...),否则您必须稍后进行重构。就像现在..
    【解决方案5】:

    【讨论】:

      【解决方案6】:

      来自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。大多数大型网站都有通用代码,这些代码包含在可以为您执行此操作的每个页面的顶部。

      还有一个名为 override_function 的内置 php 函数(由 ChrisH 提到)。它没有在 php 手册页中完整记录,但是如果您更喜欢 rename_function 函数,则文档下方的用户 cmets 会为您提供使用它所需的信息。如果您需要从替换中调用原始函数,则讨论了限制为一个覆盖。使用 rename_function 而不是 override 函数可以消除这种潜在的限制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多