代码之家  ›  专栏  ›  技术社区  ›  erotsppa

有没有一种方法可以在php中重写/重命名/重新映射函数?

php
  •  2
  • erotsppa  · 技术社区  · 14 年前

    我知道在其他语言(C++和Obj-C)中(甚至在运行时和编译时)都是可能的,但是在PHP中有一种方法可以重写/重命名/重映射函数吗?所以我的意思是,假设我们要替换mysql\u 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...)
    }
    

    7 回复  |  直到 14 年前
        1
  •  2
  •   Peter O'Callaghan    14 年前

    我相信,如果你使用名称空间,你可以用相同的名称编写一个新函数,并以这种方式“欺骗”系统。这里有一个简短的博客我读到关于它的。。。

    http://till.klampaeckel.de/blog/archives/105-Monkey-patching-in-PHP.html

        2
  •  2
  •   symcbean    14 年前

    正如ianhales所说的,您可以使用APD扩展或使用 runkit 这两个扩展都有很多其他有用的地方,但是如果你把它们应用到面向internet的web服务器上,它们都会以奇怪的方式破坏你的系统。

    更好的解决方案是在部署代码时重新编写代码(这可以自动完成,例如使用sed),也可以使用auto\u prepend。

    C。

        3
  •  0
  •   Mchl    14 年前

    不是从PHP.net下载的PHP。不过,有一个扩展允许这样做。

    如果您想要的是mysql函数,那么最好考虑扩展mysqli类。

        5
  •  0
  •   Powerlord    14 年前

    更好的方法是从一开始就使用抽象层,比如 PDO . PDO附带PHP5.1和更新版本,并作为PHP5.0.x的PECL扩展提供。

        6
  •  0
  •   Starx    14 年前

    如果你在类中有函数。我们可以从继承它的其他类重写它。

    例子

    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
    
        7
  •  0
  •   RobertPitt    13 年前

    namespace MySQL
    {
        function connect()
        {
             //Blah
        }
    }
    

    然后像这样使用:

    <?php
    
    mysql_connect(); //Native Version
    MySQL\connect(); //Your Version