Кто-нибудь знает, что может вызвать эту проблему?
PHP Fatal error: Cannot redeclare class
Кто-нибудь знает, что может вызвать эту проблему?
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
более одного раза.
Иногда это происходит из-за некоторых ошибок в PHP FastCGI.
Попробуйте перезапустить его. В Ubuntu это:
service php-fastcgi restart
У меня была та же проблема при использовании 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");
}
Если у вас установлен жесткий свет, удалите его. убедитесь, что вы также установите флажок, который удаляет папку для этой темы.