Как я могу исправить фатальную ошибку: не могу повторно объявить класс, который только на Macintosh?

Я получаю эту фатальную ошибку только при запуске на Macintosh, но не в браузере Windows, что не имеет смысла, поскольку, кроме проверки состояния Browser, условные циклы запускают один и тот же код:

Может кто-нибудь помочь мне понять, как остановить эту ошибку в php? Ошибка возникает в первом экземпляре QEnterKeyEvent... а НЕ во втором. Это не имеет смысла.

В коде первый экземпляр - это первый раз, когда он вызывается, поэтому, насколько я могу судить, класс еще не создан.

Тем не менее ошибка говорит: не может переопределить класс QEnterKeyEvent

// Key-Specific Events (EnterKey, EscapeKey, UpArrowKey, DownArrowKey, etc.)

if (QApplication::IsBrowser(QBrowserType::Macintosh)) {
    echo "keyspecific events - macintosh";

    class QEnterKeyEvent extends QKeyPressEvent {
        protected $strCondition = 'event.keyCode == 13';
    }
    class QEscapeKeyEvent extends QKeyPressEvent {
        protected $strCondition = 'event.keyCode == 27';
    }
    class QUpArrowKeyEvent extends QKeyPressEvent {
        protected $strCondition = 'event.keyCode == 38';
    }
    class QDownArrowKeyEvent extends QKeyPressEvent {
        protected $strCondition = 'event.keyCode == 40';
    }
} else {
    echo "key specific events - windows";

    class QEnterKeyEvent extends QKeyDownEvent {
        protected $strCondition = 'event.keyCode == 13';
    }
    class QEscapeKeyEvent extends QKeyDownEvent {
        protected $strCondition = 'event.keyCode == 27';
    }
    class QUpArrowKeyEvent extends QKeyDownEvent {
        protected $strCondition = 'event.keyCode == 38';
    }
    class QDownArrowKeyEvent extends QKeyDownEvent {
        protected $strCondition = 'event.keyCode == 40';
    }
}

4 ответа

Я вижу этот пример кода из базы кода QCodo? В этом случае вам, вероятно, следует сообщить о проблеме через их форум "Ошибки и проблемы". Посмотрев туда, я вижу, что уже есть пара отчетов: это и это...

Вот полный блок кода (из сообщения на форуме на сайте Qcodo):

// Key-Specific Events (EnterKey, EscapeKey, UpArrowKey, DownArrowKey, etc.)

if (QApplication::IsBrowser(QBrowserType::Macintosh)) {
    class QEnterKeyEvent extends QKeyPressEvent {
        protected $strCondition = 'event.keyCode == 13';
    }
    class QEscapeKeyEvent extends QKeyPressEvent {
        protected $strCondition = 'event.keyCode == 27';
    }
    class QUpArrowKeyEvent extends QKeyPressEvent {
        protected $strCondition = 'event.keyCode == 38';
    }
    class QDownArrowKeyEvent extends QKeyPressEvent {
        protected $strCondition = 'event.keyCode == 40';
    }
} else {
    class QEnterKeyEvent extends QKeyDownEvent {
        protected $strCondition = 'event.keyCode == 13';
    }
    class QEscapeKeyEvent extends QKeyDownEvent {
        protected $strCondition = 'event.keyCode == 27';
    }
    class QUpArrowKeyEvent extends QKeyDownEvent {
        protected $strCondition = 'event.keyCode == 38';
    }
    class QDownArrowKeyEvent extends QKeyDownEvent {
        protected $strCondition = 'event.keyCode == 40';
    }
} 

Итак, при втором чтении я считаю, что проблема не в том, что этот блок кода затрагивает оба определения классов, а в том, что этот блок кода на самом деле вызывается дважды. И выглядит (с первого взгляда на Qcodo), что это произойдет, если Qcodo инициализируется дважды.

В QApplicationBase::Initialize() есть следующий код:

  // Preload Class Files
  foreach (QApplication::$PreloadedClassFile as $strClassFile)
      require($strClassFile);

Попробуйте заменить это кодом ниже и посмотрите, решена ли проблема? Если это так, возможно, вы случайно произвели инициализацию Qcodo дважды где-то в своем коде.

  // Preload Class Files
  foreach (QApplication::$PreloadedClassFile as $strClassFile)
      require_once($strClassFile);

Я столкнулся с этой же проблемой, пытаясь установить XSilva Lightspeed Webstore для клиента. После некоторого копания и тестирования, я думаю, я решил проблему. (К вашему сведению, просто изменение 'require' на 'require_once' - хотя это хорошая идея - не сработало для меня.) Я знаю, что это ужасный хак, но я обернул проблемный блок кода проверкой class_exists() следующим образом:

// Key-Specific Events (EnterKey, EscapeKey, UpArrowKey, DownArrowKey, etc.)
if (QApplication::IsBrowser(QBrowserType::Macintosh)) {
    if(!class_exists('QEnterKeyEvent') and !class_exists('QEscapeKeyEvent') and !class_exists('QUpArrowKeyEvent') and !class_exists('QDownArrowKeyEvent')) {
        class QEnterKeyEvent extends QKeyPressEvent {
            protected $strCondition = 'event.keyCode == 13';
        }   
        class QEscapeKeyEvent extends QKeyPressEvent {
            protected $strCondition = 'event.keyCode == 27';
        }   
        class QUpArrowKeyEvent extends QKeyPressEvent {
            protected $strCondition = 'event.keyCode == 38';
        }   
        class QDownArrowKeyEvent extends QKeyPressEvent {
            protected $strCondition = 'event.keyCode == 40';
        }   
    }   
} else {
    class QEnterKeyEvent extends QKeyDownEvent {
        protected $strCondition = 'event.keyCode == 13';
    }   
    class QEscapeKeyEvent extends QKeyDownEvent {
        protected $strCondition = 'event.keyCode == 27';
    }   
    class QUpArrowKeyEvent extends QKeyDownEvent {
        protected $strCondition = 'event.keyCode == 38';
    }   
    class QDownArrowKeyEvent extends QKeyDownEvent {
        protected $strCondition = 'event.keyCode == 40';
    }   
}   

Оба блока кода определяют один и тот же класс:

class QEnterKeyEvent extends QKeyDownEvent {
            protected $strCondition = 'event.keyCode == 13';
}

Исходя из приведенного вами примера кода, имеет смысл определить этот класс за пределами операторов if / else полностью, что сократит объем кода для поддержки и устранит вашу ошибку.

Тем не менее, я подозреваю, что вы можете не соответствовать скобкам при чтении кода; из фрагмента при его вставке ошибка не должна возникать.

Если определение второго класса встречается так же, как и первое (поскольку они не являются частью одного и того же условного выражения), вы ожидаете увидеть эту ошибку.

Если вы решили не реструктурировать свой код, чтобы избежать дублирования (у вас могут быть веские причины для текущей структуры, которые не указаны в приведенном вами фрагменте), вы можете использовать PHP class_exists(), чтобы избежать попытки дублирования класса определение:

} else {
  if ( !class_exists('QEnterKeyEvent') ) {
    class QEnterKeyEvent extends QKeyDownEvent {
      protected $strCondition = 'event.keyCode == 13';
    }
  }
}

Если вы используете этот подход, имеет смысл тщательно проверить, что класс определен так, как вы этого ожидаете во всех случаях.

PS. Это пример кода из кодовой базы QCodo? Если это так, вы, вероятно, должны сообщить о проблеме через их форум "Ошибки и проблемы".

PPS. О, посмотри. Смотрите это и это...

Существует ветка сообщества QCodo под названием QCubed, и они, похоже, уже исправили QA. http://trac.qcu.be/projects/qcubed/ticket/134

Другие вопросы по тегам