Кто-нибудь знает, что может вызвать эту проблему?
PHP Fatal error: Cannot redeclare class
Это означает, что вы уже создали класс.
Например:
class Foo {} // some code here class Foo {}
Этот второй Foo выбросит ошибку.
У вас есть одноименный класс, объявленный более одного раза. Возможно через несколько включений. При включении других файлов вам нужно использовать что-то вроде
include_once "something.php";
для предотвращения множественных включений. Это очень легко, но это не всегда очевидно, поскольку у вас может быть длинная цепочка файлов, которые будут включены друг в друга.
Это происходит, когда вы объявляете класс более одного раза на странице. Вы можете исправить это, либо завернув этот класс в оператор if (например, ниже), либо вы можете поместить его в отдельный файл и использовать require_once()
вместо include()
.
if (!class_exists('TestClass')) { // Put class TestClass here }
Используйте include_once();
– при этом ваши коды будут включены только один раз.
Это произойдет, если мы используем любой из встроенных классов в php-библиотеке. Я использовал имя класса как Directory и получил ту же ошибку. Если вы сначала получите ошибку, убедитесь, что имя класса, которое вы используете, не является одним из встроенных классов.
Эта ошибка также может возникнуть, если вы определяете метод __construct
более одного раза.
Иногда это происходит из-за некоторых ошибок в FastCGI PHP.
Попробуйте перезапустить его. В Ubuntu это:
service php-fastcgi restart
У меня была такая же проблема при использовании autoload
как autoload
ниже:
<?php function __autoload($class_name) { include $class_name . '.php'; } __autoload("MyClass1"); $obj = new MyClass1(); ?>
и в другом классе было:
namespace testClassNamespace; class MyClass1 { function __construct() { echo "MyClass1 constructor"; } }
Решение состоит в том, чтобы сохранить совместимость пространства имен, в моем namespace testClassNamespace;
в обоих файлах.
Просто добавление;
Эта ошибка также может возникнуть, если вы по ошибке поместили функцию внутри другой функции.
PHP 5.3 (я думаю, что более старые версии тоже), похоже, имеет проблемы с тем же именем в разных случаях. Таким образом, у меня была эта проблема, когда у меня был класс Login и интерфейс, который он реализует LogIn. После того как я переименовал LogIn в Log_In, проблема была решена.
Эта функция будет печатать стек, сообщающий вам, откуда он был вызван:
function PrintTrace() { $trace = debug_backtrace(); echo '<pre>'; $sb = array(); foreach($trace as $item) { if(isset($item['file'])) { $sb[] = htmlspecialchars("$item[file]:$item[line]"); } else { $sb[] = htmlspecialchars("$item[class]:$item[function]"); } } echo implode("\n",$sb); echo '</pre>'; }
Вызовите эту функцию в верхней части файла, который включает ваш класс.
Иногда он будет печатать только один раз, даже если ваш класс включен два или более раз. Это связано с тем, что PHP фактически анализирует все классы верхнего уровня в файле перед выполнением какого-либо кода и немедленно выдает фатальную ошибку. Чтобы исправить это, оберните объявление класса в if(true) { ... }
, которое переместит ваш класс вниз по уровню. Затем вы должны получить свои две трассы перед ошибками PHP.
Это поможет вам найти, где ваш класс включается из нескольких раз в сложный проект.
Просто делайте одно, когда вы включаете или требуете имя файла, а именно class.login.php. Вы можете включить его так:
include_once class.login.php or require_once class.login.php
Таким образом, он никогда не вызывает ошибку.
Вы использовали Zend Framework? У меня такая же проблема.
Я решил это, комментируя следующую строку в config/application.ini
:
;includePaths.library = APPLICATION_PATH "/../library"
Я надеюсь, что это поможет вам.
Другой возможный виновник – это контроль источника и неразрешенные конфликты. SVN может привести к тому, что один и тот же класс появится дважды в конфликтующем файле кода; две альтернативные версии («мои» и «их»).
Я столкнулся с той же проблемой: более новая версия php не имеет одинакового отношения с множественным включением одного и того же файла (как библиотеки), поэтому теперь мне нужно изменить все мои включения некоторыми include_once.
Или эти трюки могут помочь, если у вас слишком много занятий в вашей библиотеке …
if( class_exists('TestClass') != true ) { //your definition of TestClass }
У меня была та же проблема: «PHP Fatal error: Невозможно переопределить класс XYZ.php».
У меня есть две директории, такие как controller
и model
и я загрузил ошибочно XYZ.php в обоих каталогах (так что файл с тем же именем вызывает проблему).
Найдите в своем проекте и убедитесь, что у вас есть только один класс XYZ.php.
Добавьте пространство имен в свой класс, чтобы вы могли использовать одно и то же имя класса.
я столкнулся с той же проблемой. выяснилось, что это было имя класса. я справился с этим, изменив имя. следовательно, решение проблемы.
Я решил проблему со следующим. Надеюсь, это поможет вам немного.
if(!class_exists("gt_core")) { require_once("core.db.class.php"); }
Если у вас установлен жесткий свет, удалите его. убедитесь, что вы установите флажок, который удаляет папку для этой темы.