• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • override_function()

    (PECL apd >= 0.2)

    Overrides built-in functions

    说明

    override_function(string $function_name,string $function_args,string $function_code): bool

    Overrides built-in functions by replacing them in the symbol table.

    参数

    $function_name

    The function to override.

    $function_args

    The function arguments, as a comma separated string.

    Usually you will want to pass this parameter, as well as the$function_codeparameter, as a single quote delimited string. The reason for using single quoted strings, is to protect the variable names from parsing, otherwise, if you use double quotes there will be a need to escape the variable names, e.g.$your_var.

    $function_code

    The new code for the function.

    返回值

    成功时返回TRUE,或者在失败时返回FALSE

    范例

    Example #1 override_function() example

    <?php
    override_function('test', '$a,$b', 'echo "DOING TEST"; return $a * $b;');
    ?>
    
    I thought the example was not very helpful, because it doesn't even override the function with another function.
    My question was: If I override a function, can I call the ORIGINAL function within the OVERRIDING function?
    ie, can I do this:
    <?php
    override_function('strlen', '$string', 'return override_strlen($string);');
    function override_strlen($string){
        return strlen($string); 
    }
    ?>
    The answer: NO, you will get a segfault.
    HOWEVER, if you use rename_function to rename the original function to a third name, then call the third name in the OVERRIDING function, you will get the desired effect:
    <?php
    rename_function('strlen', 'new_strlen');
    override_function('strlen', '$string', 'return override_strlen($string);');
    function override_strlen($string){
        return new_strlen($string); 
    }
    ?>
    I plan to use this functionality to generate log reports every time a function is called, with the parameters, time, result, etc... So to wrap a function in logging, that was what I had to do.
    Overriden function name becomes __overridden__(). That's why you can't override two function, and that's how you can use the original function in the override.
    Of course you can't overwrite "functions" like require_once or print as they are not really a function but a language construct.
    You can find Excepción - Call to undefined function override_function()
    due to Function override_function is part of PECL Extension.
    Configure PECL
    Please note that this function (as of v1.0.1 in PHP 5.3) will <b>not</b> override some important built-in "functions". Specifically, those which are actually statements/keywords, such as:
      require
      include
      require_once
      include_once
      echo
      print
    I was hoping to use it to trace the chains of require/include activity among files in a large legacy project, but it seems APD will not do what I need.
    Yes you can if you rename the overridden function. So you first rename original function, then override it and finally rename the overridden one, something like this:
    rename_function('feof', 'real_feof');
    override_function('feof', '$handle', 'return true;');
    rename_function("__overridden__", 'dummy_feof');
    There is not chance to override 2 or more functions, because of the error:
    Fatal error: Cannot redeclare __overridden__()
    Maybe it's better to use overwritten function inside the override to code something like this :
    <?php
    rename_function('myFunction','original_myFunction');
    override_function('myFunction','$arg,…,$argN','return override_myFunction($arg,…,$argN);');
    ?>
    You may then give somehow "inheritance" to override_myFunction …
    As a parent :
    <?php
    function override_myFunction($arg,…,$argN)
    {  $result=original_myFunction($arg,…,$argN));
       /* CODE that manipulates the result */
       return $result;
    }
    ?>
    As a child :
    <?php
    function override_myFunction($arg,…,$argN)
    {  /* CODE that manipulates the arguments */
       return original_myFunction($arg,…,$argN));
    }
    ?>