Как я могу исправить фатальную ошибку: не могу переопределить класс, который есть только на Macintosh? - PullRequest
1 голос
/ 06 января 2009

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

Может кто-нибудь помочь мне понять, как остановить эту ошибку в 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 ]

1 голос
/ 06 января 2009

Я вижу этот пример кода из базы кодов 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);
0 голосов
/ 02 февраля 2010

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

0 голосов
/ 09 января 2010

Я столкнулся с этой же проблемой, пытаясь установить 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';
    }   
}   
0 голосов
/ 06 января 2009

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

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. О, посмотри. См. это и это ...

...