如何修复致命错误:无法重新声明只在Macintosh上运行的类?

时间:2009-01-05 23:46:27

标签: php macos qcodo

只有当我在Macintosh上运行时才会出现这个致命的错误,但是在Windows浏览器上没有,这是没有意义的,因为除了检查浏览器条件之外,条件循环运行相同的代码:

有人可以帮我理解如何在php中停止此错误吗?错误发生在QEnterKeyEvent的FIRST实例上......而不是第二个。这没有意义。

在代码中,第一个实例是第一次被调用,所以到目前为止还没有创建类。

然而错误说:不能重新声明类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 个答案:

答案 0 :(得分:1)

我看到这个代码示例来自QCodo代码库?在这种情况下,你可能应该通过他们"Bugs and Issues" forum.报告问题。看了之后,我看到已有几个报告:thisthis ...

这是完整的代码块(来自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);

答案 1 :(得分:0)

两个代码块都定义了相同的类:

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代码库吗?如果是这样,您可能应该通过"Bugs and Issues" forum.

报告问题

PPS。哦,看。请参阅thisthis ...

答案 2 :(得分:0)

我在尝试为客户端安装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';
    }   
}   

答案 3 :(得分:0)

QCodo的社区分支称为QCubed,他们现在似乎已经修复了QA。 http://trac.qcu.be/projects/qcubed/ticket/134