Есть ли способ избежать фатальной ошибки «redeclared function» при определении функций внутри функций в PHP? - PullRequest
3 голосов
/ 21 февраля 2010

Я внедряю определенный плагин (dtabs) на своей странице в Wordpress, но после обновления до последней версии я обнаружил, что у меня теперь появляется ошибка во второй раз, когда я вызываю основную функцию с именем dtab_list_tabs().

Как это работает, плагин получает include_once'd, но основная функция вызывается, сколько раз вы хотите разместить вкладки в вашем макете. У меня есть 2 таких звонка на dtab_list_tabs().

Теперь проблема в том, по какой причине разработчик решил включить другую функцию прямо в dtab_list_tabs(), которая называется current_tab(). Поскольку он объявлен внутри функции, очевидно, PHP пытается переопределить его, как только вы вызовете родительскую функцию во второй раз, что для меня не имеет никакого смысла.

Неустранимая ошибка PHP: Невозможно повторно объявить current_tab () (ранее объявлено в ... / wp-content / plugins / dtabs / dtabs.php: 1638) в ... / wp-content / plugins /dtabs/dtabs.php в строке 1638

Код для этой ревизии: http://plugins.svn.wordpress.org/!svn/bc/208481/dtabs/trunk/dtabs.php

Я пытаюсь выяснить, есть ли способ сказать PHP, что да ... у него есть внутренняя функция, которая, насколько я знаю, является совершенно правильной парадигмой PHP, так что не надо переопределить его и потерпеть неудачу.

Что касается текущей ситуации, я удалил current_tab(), поскольку он, кажется, не используется.

Ответы [ 3 ]

5 голосов
/ 21 февраля 2010

Вы можете использовать function_exists () , чтобы проверить, была ли уже определена функция с таким именем. Если вы сделаете определение условным (если (что-то) {function foo () {...}}), то php будет «оценивать» определение только при выполнении условия.

function foo() {
  if ( !function_exists('bar') ) {
    function bar() {
      echo 'bar ';
    }
  }

  bar();
}

foo();
foo();

см. Также: http://docs.php.net/functions.user-defined

(Но я бы постарался избежать всего этого вместе)

3 голосов
/ 21 февраля 2010

Вы можете заключить объявление вашей функции в оператор if. Используйте function_exists(), чтобы увидеть, была ли функция объявлена ​​ранее или нет.

if(!function_exists('current_tab')) {
  function current_tab() {
    myMagicCode();
  }
}
1 голос
/ 21 февраля 2010

Вы можете попробовать это:

if (!function_exists('my_function')) {
  function my_function() {

  }
}

function_exists() - вернуть TRUE, если заданная функция была определена

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...