Is it possible to replace (monkeypatch) PHP functions?

前端 未结 6 729
感情败类
感情败类 2020-11-27 07:36

You can do this in Python, but is it possible in PHP?

>>> def a(): print 1
... 
>>> def a(): print 2
... 
>>> a()
2
相关标签:
6条回答
  • 2020-11-27 07:57

    I realize this question is a bit old, but Patchwork is a recently-released PHP 5.3 project that supports redefinition of user-defined functions. Though, as the author mentions, you will need to resort to runkit or php-test-helpers to monkey-patch core/library functions.

    0 讨论(0)
  • 2020-11-27 08:00

    No, it is not possible to do this as you might expect.

    From the manual:

    PHP does not support function overloading, nor is it possible to undefine or redefine previously-declared functions.

    HOWEVER, You can use runkit_function_redefine and its cousins, but it is definitely not very elegant...

    You can also use create_function to do something like this:

    <?php
    $func = create_function('$a,$b','return $a + $b;');
    echo $func(3,5); // 8
    $func = create_function('$a,$b','return $a * $b;');
    echo $func(3,5); // 15
    ?>
    

    As with runkit, it is not very elegant, but it gives the behavior you are looking for.

    0 讨论(0)
  • 2020-11-27 08:06

    As jmikola mentioned, Patchwork is a good solution if you want to add code to a function.

    Here's an article about how it works: http://phpmyweb.net/2012/04/26/write-an-awesome-plugin-system-in-php/

    It comes with some sample code. I think the phpmyweb version uses a slightly better code, because he doesn't use eval()'d code, unlike patchwork. You can cache opcodes when using eval().

    0 讨论(0)
  • 2020-11-27 08:09

    Kind of. See http://dev.kafol.net/2008/09/php-redefining-deleting-adding.html.

    0 讨论(0)
  • 2020-11-27 08:16

    This is a bit late, but I just want to point out that since PHP 5.3, it is actually possible to override internal functions without using a PHP extension.

    The trick is that you can redefine an internal PHP function inside a namespace. It's based on the way PHP does name resolution for functions:

    Inside namespace (say A\B), calls to unqualified functions are resolved at run-time. Here is how a call to function foo() is resolved:

    1. It looks for a function from the current namespace: A\B\foo().
    2. It tries to find and call the global function foo()
    0 讨论(0)
  • 2020-11-27 08:19

    The accepted answer is excellent!!! I will just add,that you can put your codes in Namespace brackets and then the default GLOBAL-SPACE is resetted.

    some other ways:

    1) rename_function($old_name,$new_name)

    2) override_function($old_name, $parameters, $new_func)

    and rarely used:

    3) runkit_function_rename(...)

    4) runkit_function_redefine(...)

    0 讨论(0)
提交回复
热议问题