Вы можете сделать это в Python, но возможно ли это в 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
Вы можете сделать это в Python, но возможно ли это в 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
Это немного поздно, но я просто хочу отметить, что, начиная с PHP 5.3, можно переопределить внутренние функции без использования расширения PHP.
Хитрость в том, что вы можете переопределить внутреннюю функцию PHP внутри пространства имен. Он основан на том, как PHP разрешает имена для функций:
Внутри пространства имен (скажем, A\B) вызовы неквалифицированных функций разрешаются во время выполнения. Вот как разрешается вызов функции foo():
Нет, это невозможно сделать, как вы могли ожидать.
Из manual
:
PHP не поддерживает перегрузку функций, а также невозможно отменить или переопределить ранее объявленные функции.
ОДНАКО, вы можете использовать runkit_function_redefine
и его аналоги, но это конечно не очень элегантно...
Вы также можете использовать create_function
, чтобы сделать что-то вроде этого:
<?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
?>
Как и в случае с runkit, это не очень элегантно, но дает нужное вам поведение.
Я понимаю, что этот вопрос немного устарел, но Patchwork — это недавно выпущенный PHP 5.3. проект, поддерживающий переопределение пользовательских функций. Хотя, как отмечает автор, вам нужно будет прибегнуть к runkit или php-test-helpers для обезьяны -патч ядра/библиотеки функций.
Вроде. См. http://dev.kafol.net/2008/09/php-redefining-deleting-adding.html.
Как упомянул jmikola, Patchwork — хорошее решение, если вы хотите добавить код в функцию.
Вот статья о том, как это работает: http://phpmyweb.net/2012/04/26/write-an-awesome-plugin-system-in-php/
Он поставляется с некоторым образцом кода. Я думаю, что версия phpmyweb использует немного лучший код, потому что он не использует код eval(), в отличие от пэчворка. Вы можете кэшировать коды операций при использовании eval().
eval()
, о которых нужно беспокоиться.
- person Spudley; 15.05.2012
streamWrapper
. При этом вы можете в основном переписать включенные исходные файлы, прежде чем они будут проанализированы интерпретатором PHP.
- person Vivendi; 08.04.2015
StreamWrapper
. Вы можете переопределить его, только зарегистрировав собственную реализацию класса streamWrapper
с помощью stream_wrapper_register
. Вы знаете, какие методы вы можете переопределить, потому что PHP сообщает вам, какие методы доступны по ссылке, которую вы разместили.
- person Vivendi; 15.04.2015
Принятый ответ отличный!!! Я просто добавлю, что вы можете поместить свои коды в скобки пространства имен, а затем по умолчанию GLOBAL-SPACE сбрасывается.
1) rename_function($old_name,$new_name)
2) override_function($old_name, $parameters, $new_func)
и редко используется:
3) runkit_function_rename(...)
4) runkit_function_redefine(...)