Действительно ли возможно заменить (monkeypatch) PHP функции?

Да. В C и C ++ вы не можете передавать массивы в функции. Так оно и есть.

Почему вы все равно делаете простые массивы? Вы посмотрели boost / std::tr1::array / std::array или std::vector?

Обратите внимание, что вы можете передать ссылку на массив произвольной длины на шаблон функции . С головы:

template< std::size_t N >
void f(char (&arr)[N])
{
  std::cout << sizeof(arr) << '\n';
}
17
задан gak 10 February 2009 в 00:24
поделиться

6 ответов

Это бит поздно, но я просто хочу отметить, что начиная с PHP 5.3, на самом деле можно переопределять внутренние функции без использования расширения PHP.

Хитрость в том, что вы можете переопределить внутреннюю функцию PHP внутри пространства имен. Он основан на том, как PHP выполняет разрешение имен для функций:

Внутри пространства имен (скажем, A \ B) вызовы неквалифицированных функций разрешаются во время выполнения. Вот как разрешается вызов функции foo ():

  1. Она ищет функцию из текущего пространства имен: A \ B \ foo ().
  2. Он пытается найти и вызвать глобальную функцию foo ()
14
ответ дан 30 November 2019 в 12:27
поделиться

Нет, это невозможно сделать так, как вы могли бы ожидать.

Из 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, он не очень элегантен, но дает поведение, которое вы ищете .

9
ответ дан 30 November 2019 в 12:27
поделиться

Я понимаю, что этот вопрос немного устарел, но Patchwork - это недавно выпущенный проект PHP 5.3, который поддерживает переопределение пользовательских функций. Хотя, как упоминает автор, вам придется прибегнуть к runkit или php-test-helpers для функций ядра / библиотеки monkey-patch.

5
ответ дан 30 November 2019 в 12:27
поделиться
2
ответ дан 30 November 2019 в 12:27
поделиться

Как упоминал jmikola, Patchwork - хорошее решение, если вы хотите добавить код в функцию.

Вот статья о том, как это работает: http://phpmyweb.net/2012/04/26/write-an-awesome-plugin-system-in-php/

Это идет с некоторым примером кода. Я думаю, что версия phpmyweb использует немного лучший код, потому что он не использует код eval (), в отличие от пэчворка. Вы можете кэшировать коды операций при использовании eval ().

1
ответ дан 30 November 2019 в 12:27
поделиться

Принятый ответ отлично !!! Я просто добавлю, что вы можете поместить ваши коды в скобки пространства имен , и тогда значение 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 (...)

0
ответ дан 30 November 2019 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: