Если у меня есть функция:
function this($a){
return $a;
}
Если бы я хотел переопределить функцию, было бы так же просто, как переписать его?
function this($a, $b){ //New this function
return $a * $b;
}
Если у меня есть функция:
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 в производственных сценариях обычно считается сомнительной практикой. Если вы хотите обменять алгоритмы во время выполнения, посмотрите на Стратегический шаблон или Анонимные функции.
Если по redefine вы имеете в виду добавить к существующей пользовательской функции, рефактору, заменить или переписать, тогда да: это так же просто, как вы показали. Просто добавьте дополнительный код к функции, но убедитесь, что вы установили по умолчанию для обратной совместимости.
Другой вариант - использовать http://antecedent.github.io/patchwork
Patchwork - это библиотека PHP, которая позволяет переопределить пользовательские функции и методы во время выполнения, свободно реплицируя функциональность
runkit_function_redefine
в чистом PHP 5.3 коде, который, помимо прочего, позволяет вам заменять статические и частные методы с двойными испытаниями.
Вы не можете переопределить или 'undefine' функцию в PHP (не прибегая к сторонним модулям). Однако вы можете условно определить функцию.
Итак, если вы знаете, что функция A может быть определена в другом месте, но не всегда, вы можете ее обернуть следующим образом:
if (!function_exists('A')) {
function A() {
// default A implementation
}
}
Затем вам нужно только убедиться, что вы хотите выполнить реализацию:
function A() {
// another A implementation
}
У меня есть библиотека функций, которые иногда я просто не хочу вызывать при тестировании (как правило, обновлениях базы данных). Если у меня есть, например, несколько различных функций обновления db, которые находятся по всему коду. вместо того, чтобы комментировать код, я просто создаю специальный класс (например, класс foo {}). Определите глобальную переменную (например, $DEBUG) и фиктивную функцию (например, функцию dummy {}). Внутри foo определяют все (публичные статические) функции, которые вам нужно подражать как
$fn = isset ($ DEBUG)? 'dummy': "действительная функция"; return call_user_func_array ($ fn, func_get_args());
Кроме того, у вас есть преимущества теперь делать другие вещи, такие как протоколирование вызовов и параметров.
Затем просто замените все ваши вызовы на real_function (...) с помощью foo:: real_function (...). Обычно просто простой поиск/замена (или оставить его там, в зависимости от того, что происходит в функции и как часто это называется накладными, может быть неактуальным).
Вы не можете одновременно объявлять обе функции, что приведет к ошибке.
Вы не можете его обновить. Если ваш вопрос касается перегрузки этого примера, как насчет:
function this($a, $b=1)
{
return $a * $b;
}
Установка соответствующего значения по умолчанию для любых добавленных новых аргументов может помочь в обратной совместимости, т.е.:
function this($a, $b=1){ //New this function with a sane default.
return $a * $b;
}
Я также рекомендую для ясности вообще избегать использования this
для имен функций/переменных.
У меня хорошие новости и плохие новости.
Хорошие новости
Это возможно (ссылки (ссылки) ниже).
nadnews
Есть две плохие новости:
И вторая плохая новость: Вам нужно жертвовать читабельностью кода.
Пример:
<?php
function this($a){
return $a;
}
echo this(0);
$f_name = 'this';
$f_args = '$a';
$f_code = 'return $a*$b;';
runkit_function_redefine($f_name, f_args, f_code);
echo this(1,3);
О, и еще одна вещь, используя this
как имя для функции, может создать путаницу из-за того, что методы объекта класса могут использовать this.something
для ссылки на переменную something
, которая находится в методе и имеет то же имя, что и переменная something
от самого объекта. Вот пример
<?php
class theclass{
$a = 'a';
function a($a){
echo $a;
$a = this.$a;
}
}
theclass $object = new theclass();
$object -> a('b'); // will echo: ab