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

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

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

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

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

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

Нет, это порождает ошибку:

 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