You can do this in Python, but is it possible in PHP?
>>> def a(): print 1
...
>>> def a(): print 2
...
>>> a()
2
e.g.:
<? function var_dump() {} ?>
Fatal error: Cannot redeclare var_dump() in /tmp/- on line 1
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:
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.
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.
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().
eval() to worry about.streamWrapper class. With that you can basically rewrite included source files before they are parsed by the PHP interpreter.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.
1) rename_function($old_name,$new_name)
2) override_function($old_name, $parameters, $new_func)
and rarely used: