Если у меня есть функция:
function this($a){
return $a;
}
Если бы я хотел переопределить функцию, то это было бы столь же просто как перезапись его?
function this($a, $b){ //New this function
return $a * $b;
}
Нет, это вызывает ошибку:
Fatal error: Cannot redeclare foo()
Runkit предоставляет параметры, включая runkit_function_rename ()
и runkit_function_redefine ()
.
Вы не можете объявить обе функции одновременно, это приведет к ошибке.
Если вы имеете в виду перегрузку в смысле Java, то ответ - нет, это невозможно.
Цитата из руководства PHP по функциям :
PHP не поддерживает перегрузку функций, а также невозможно отменить или переопределить ранее объявленные функции.
Вы можете использовать расширение runkit
, но использование runkit в производственных сценариях обычно считается сомнительной практикой. Если вы хотите обмениваться алгоритмами во время выполнения, взгляните на шаблон стратегии или Анонимные функции .
Если под переопределением вы подразумеваете добавление к существующей пользовательской функции, рефакторинг, замену или переписывание, тогда да: это так же просто, как вы показали. Просто добавьте в функцию дополнительный код, но убедитесь, что вы установили значение по умолчанию для обратной совместимости.
Другой вариант - использовать http://antecedent.github.io/patchwork
Patchwork - это библиотека PHP, которая позволяет переопределять определяемые пользователем функции и методы во время выполнения, слабо копируя функциональность.
runkit_function_redefine
в чистом коде PHP 5.3, который, помимо прочего, позволяет заменять статические и частные методы тестовыми двойниками.
Установка соответствующего значения по умолчанию для любых новых аргументов, которые вы добавляете, может помочь для обратной совместимости, т.е.:
function this($a, $b=1){ //New this function with a sane default.
return $a * $b;
}
Я также рекомендую, для ясности, вообще избегать использования this
для имен функций/переменных.
Вы не можете передекларировать его. Если ваш вопрос только о перегрузке этого примера, как насчет:
function this($a, $b=1)
{
return $a * $b;
}