PHP Doku:: Overrides built-in functions - function.override-function.html

Verlauf / Chronik / History: (42) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzDas Verhalten von PHP beeinflussenAdvanced PHP debuggerAPD Funktionenoverride_function

Ein Service von Reinhard Neidl - Webprogrammierung.

APD Funktionen

<<apd_set_session

rename_function>>

override_function

(PECL apd >= 0.2)

override_functionOverrides built-in functions

Beschreibung

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

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

Parameter-Liste

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.

Rückgabewerte

Gibt bei Erfolg TRUE zurück. Im Fehlerfall wird FALSE zurückgegeben.

Beispiele

Beispiel #1 override_function() example

<?php
override_function
('test''$a,$b''echo "DOING TEST"; return $a * $b;');
?>


4 BenutzerBeiträge:
- Beiträge aktualisieren...
taher at unixwars dot com
28.11.2008 17:08
I had the same problem and, since the __overriden__() name is hardcoded, I simply ended up renaming that one. I use it like this:

<?php
function _dbslayer_map()
{
   
$substs = array(
       
'mysql_connect' => 'dbslayer_mysql_connect($host, $user, $pass, $new_link, $client_flags)',
       
'mysql_fetch_array' => 'dbslayer_mysql_fetch_array($result, $result_type)',
       
'mysql_query' => 'dbslayer_mysql_query($query, $link_identifier)'
           
);

   
$args = array(
       
'mysql_connect' => '$host = NULL, $user = NULL, $pass = NULL, $new_link = false, $client_flags = 0',
       
'mysql_fetch_array' => '&$result, $result_type = MYSQL_BOTH',
       
'mysql_query' => '$query, $link_identifier = DEFAULT_LINK'
           
);

    foreach (
$substs as $func => $ren_func) {
       
override_function($func, $args[$func], "return $substs[$func];");
             
rename_function("__overridden__", $ren_func);
      }
}
?>

So far, so good.
pagan at o2 dot pl
24.10.2008 9:34
There is not chance to override 2 or more functions, because of the error:
Fatal error: Cannot redeclare __overridden__()
rojaro at gmail dot com
20.09.2005 21:13
Since Apache 1 & 2 use diffrent methods (Unicode vs. UTF8) on Win32 platforms to encode urls, i've implemented the following workaround to get around this "bug" (which is actually known behaviour and wont get fixed). This workaround is really usefull when writing PHP scripts which have to work on all platforms (Windows, Linux, BSD etc.), must process URLs and must work under both Apache versions.

<?php
$httpd
= explode(' ', $_SERVER['SERVER_SOFTWARE']);
if(
substr($httpd[0], 0, 6)=='Apache' && substr($httpd[0], 7, 1)==2 && $httpd[1]=='(Win32)')
{
  if(isset(
$_SERVER['REQUEST_URI'])) $_SERVER['REQUEST_URI'] = str_replace('%2F', '/', rawurlencode(utf8_decode(rawurldecode($_SERVER['REQUEST_URI']))));
  if(isset(
$_SERVER['REDIRECT_URL'])) $_SERVER['REDIRECT_URL'] = str_replace('%2F', '/', rawurlencode(utf8_decode(rawurldecode($_SERVER['REDIRECT_URL']))));
 
override_function('urlencode', '$url', 'return str_replace("%2F", "/", rawurlencode(utf8_encode($url)));');
}
?>
php at undeen dot com
10.03.2005 21:07
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.



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)