Да. В 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';
}
Это бит поздно, но я просто хочу отметить, что начиная с 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 для функций ядра / библиотеки monkey-patch.
Как упоминал jmikola, Patchwork - хорошее решение, если вы хотите добавить код в функцию.
Вот статья о том, как это работает: http://phpmyweb.net/2012/04/26/write-an-awesome-plugin-system-in-php/
Это идет с некоторым примером кода. Я думаю, что версия phpmyweb использует немного лучший код, потому что он не использует код eval (), в отличие от пэчворка. Вы можете кэшировать коды операций при использовании eval ().
Принятый ответ отлично !!! Я просто добавлю, что вы можете поместить ваши коды в скобки пространства имен , и тогда значение GLOBAL-SPACE по умолчанию будет сброшено.
1) rename_function ($ old_name, $ new_name)
2) override_function ($ old_name, $ parameters, $ new_func )
и редко используются: