-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpatch_function.php
More file actions
50 lines (41 loc) · 1.65 KB
/
patch_function.php
File metadata and controls
50 lines (41 loc) · 1.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
function patch_function($oldFunc, $newFunc, $prefix = 'original') {
if (!extension_loaded('runkit')) {
die('Patching functions needs the runkit extension');
}
// Rebuild the signature of the new function as string
$funcSig = $callSig = '';
$refFunc = new ReflectionFunction($newFunc);
if ($refFunc->getNumberOfParameters() > 0) {
$params = $callParams = array();
$refParams = $refFunc->getParameters();
foreach ($refParams as $refParam) {
$param = ($refParam->isPassedByReference() ? '&' : '') . '$' . $refParam->name;
if($refParam->isOptional() && $refParam->isDefaultValueAvailable()) {
$defValue = $refParam->getDefaultValue();
$param .= '=' . var_export($defValue, true);
}
$params[] = $param;
$callParams[] = '$' . $refParam->name;
}
$funcSig = implode(', ', $params);
$callSig = implode(', ', $callParams);
}
// Make anonymous function available via a unique global var
$overrideFunc = uniqid('patched_') . '_' . $oldFunc;
global $$overrideFunc;
$$overrideFunc = $newFunc;
$overrideCode = 'global $' . $overrideFunc . '; return $' . $overrideFunc . '(' . $callSig . ');';
/*
echo "override func: $overrideFunc\n";
echo "signature: $funcSig\n";
echo "call params: $callSig\n";
*/
runkit_function_rename($oldFunc, $prefix . '_' . $oldFunc);
runkit_function_add($oldFunc, $funcSig, $overrideCode);
}
patch_function('phpinfo', function($what = INFO_LICENSE) {
echo "Default output changed! :-)\n";
return original_phpinfo($what);
});
phpinfo();