override_function
(PECL apd >= 0.2)
override_function — Overrides built-in functions
Описание
$function_name
, string $function_args
, string $function_code
)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_code
parameter, 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
в случае возникновения ошибки.
Примеры
Пример #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.
There is not chance to override 2 or more functions, because of the error:
Fatal error: Cannot redeclare __overridden__()
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.
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.
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');
Of course you can't overwrite "functions" like require_once or print as they are not really a function but a language construct.
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));
}
?>
You can find Excepción - Call to undefined function override_function()
due to Function override_function is part of PECL Extension.
Configure PECL