Подтвердить что ты не робот

Переопределение функции PHP?

Если у меня есть функция:

function this($a){
   return $a;
}

Если бы я хотел переопределить функцию, было бы так же просто, как переписать его?

function this($a, $b){  //New this function
   return $a * $b;
}
4b9b3361

Ответ 2

Если вы имеете в виду перегрузку в смысле Java, тогда ответ будет отрицательным, это невозможно.

Цитата Руководство по функциям PHP:

PHP не поддерживает перегрузку функций, равно как и невозможно определить или переопределить ранее объявленные функции.

Вы можете использовать расширение runkit, но использование runkit в производственных сценариях обычно считается сомнительной практикой. Если вы хотите обменять алгоритмы во время выполнения, посмотрите на Стратегический шаблон или Анонимные функции.

Если по redefine вы имеете в виду добавить к существующей пользовательской функции, рефактору, заменить или переписать, тогда да: это так же просто, как вы показали. Просто добавьте дополнительный код к функции, но убедитесь, что вы установили по умолчанию для обратной совместимости.

Другой вариант - использовать http://antecedent.github.io/patchwork

Patchwork - это библиотека PHP, которая позволяет переопределить пользовательские функции и методы во время выполнения, свободно реплицируя функциональность runkit_function_redefine в чистом PHP 5.3 коде, который, помимо прочего, позволяет вам заменять статические и частные методы с двойными испытаниями.

Ответ 3

Вы не можете переопределить или 'undefine' функцию в PHP (не прибегая к сторонним модулям). Однако вы можете условно определить функцию.

Итак, если вы знаете, что функция A может быть определена в другом месте, но не всегда, вы можете ее обернуть следующим образом:

if (!function_exists('A')) {
    function A() {
        // default A implementation
    }
}

Затем вам нужно только убедиться, что вы хотите выполнить реализацию:

function A() {
    // another A implementation
}

Ответ 4

У меня есть библиотека функций, которые иногда я просто не хочу вызывать при тестировании (как правило, обновлениях базы данных). Если у меня есть, например, несколько различных функций обновления db, которые находятся по всему коду. вместо того, чтобы комментировать код, я просто создаю специальный класс (например, класс foo {}). Определите глобальную переменную (например, $DEBUG) и фиктивную функцию (например, функцию dummy {}). Внутри foo определяют все (публичные статические) функции, которые вам нужно подражать как

$fn = isset ($ DEBUG)? 'dummy': "действительная функция"; return call_user_func_array ($ fn, func_get_args());

Кроме того, у вас есть преимущества теперь делать другие вещи, такие как протоколирование вызовов и параметров.

Затем просто замените все ваши вызовы на real_function (...) с помощью foo:: real_function (...). Обычно просто простой поиск/замена (или оставить его там, в зависимости от того, что происходит в функции и как часто это называется накладными, может быть неактуальным).

Ответ 5

Вы не можете одновременно объявлять обе функции, что приведет к ошибке.

Ответ 6

Вы не можете его обновить. Если ваш вопрос касается перегрузки этого примера, как насчет:

function this($a, $b=1)
{
    return $a * $b;
}

Ответ 7

Установка соответствующего значения по умолчанию для любых добавленных новых аргументов может помочь в обратной совместимости, т.е.:

function this($a, $b=1){  //New this function with a sane default.
    return $a * $b;
}

Я также рекомендую для ясности вообще избегать использования this для имен функций/переменных.

Ответ 8

У меня хорошие новости и плохие новости.

Хорошие новости
Это возможно (ссылки (ссылки) ниже).

nadnews
Есть две плохие новости:

По умолчанию только функции пользовательского пространства могут быть удалены, переименованы или изменены. Чтобы переопределить внутренние функции, вы должны включить параметр runkit.internal_override в php.ini.

И вторая плохая новость: Вам нужно жертвовать читабельностью кода.

Пример:

<?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