Если у меня есть функция:
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 коде, который, помимо прочего, позволяет вам заменять статические и частные методы на тестовые двойники.
Вы не можете переопределить или «опровергнуть» функцию в PHP (не прибегая к сторонним модулям). Однако вы можете определить функцию условно.
Итак, если вы знаете, что функция A может быть определена в другом месте, но не всегда, вы можете ее обернуть следующим образом:
if (!function_exists('A')) { function A() { // default A implementation } }
Тогда вам нужно только убедиться, что вы хотите, чтобы реализация была первой:
function A() { // another A implementation }
У меня есть библиотека функций, которые иногда я просто не хочу вызывать во время тестирования (как правило, обновлений базы данных). Если у меня есть, например, несколько различных функций обновления db, которые находятся по всему коду. вместо того, чтобы комментировать код, я просто создаю специальный класс (например, класс foo {}). Определите глобальную переменную (например, $ DEBUG) и фиктивную функцию (например, функцию dummy {}). Внутри foo определяют все (публичные статические) функции, которые вам нужно подражать
$ fn = isset ($ DEBUG)? «фиктивный»: «реальная функция»; 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
Есть 2 плохие новости:
По умолчанию только функции пользовательского пространства могут быть удалены, переименованы или изменены. Чтобы переопределить внутренние функции, вы должны включить параметр 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
чтобы this.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