PHP Неустранимая ошибка: не удается переопределить класс

Кто-нибудь знает, что может вызвать эту проблему?

PHP Fatal error: Cannot redeclare class

Ответ 1

Это означает, что вы уже создали класс.

Например:

class Foo {}

// some code here

class Foo {}

Этот второй Foo выкинул бы ошибку.

Ответ 2

У вас есть одноименный класс, объявленный более одного раза. Возможно через несколько включений. При включении других файлов вам нужно использовать что-то вроде

include_once "something.php";

для предотвращения множественных включений. Это очень легко для этого, хотя и не всегда очевидное, поскольку у вас может быть длинная цепочка файлов, которые будут включены друг в друга.

Ответ 3

Это происходит, если вы объявляете класс более одного раза на странице. Вы можете исправить это путем либо упаковки этого класса с помощью оператора if (например, ниже), либо вы можете поместить его в отдельный файл и использовать require_once() вместо include().

if (!class_exists('TestClass')) {
   // Put class TestClass here
}

Ответ 4

Используйте include_once(); - при этом ваши коды будут включены только один раз.

Ответ 5

Это произойдет, если мы используем любой из встроенных классов в php-библиотеке. Я использовал имя класса как Directory и получил ту же ошибку. Если вы сначала получите ошибку, убедитесь, что имя класса, которое вы используете, не является одним из встроенных классов.

Ответ 6

Эта ошибка также может возникать, если вы определяете метод __construct более одного раза.

Ответ 7

Иногда это происходит из-за некоторых ошибок в PHP FastCGI.

Попробуйте перезапустить его. В Ubuntu это:

service php-fastcgi restart

Ответ 8

У меня была та же проблема при использовании 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; в обоих файлах.

Ответ 9

Просто добавьте:

Эта ошибка также может возникнуть, если вы по ошибке поместили функцию внутри другой функции.

Ответ 10

PHP 5.3 (я думаю, что более старые версии тоже), похоже, имеет проблемы с тем же именем в разных случаях. Таким образом, у меня была эта проблема, когда у меня был класс Login и интерфейс, который он реализует LogIn. После того, как я переименовал LogIn в Log_In, проблема была решена.

Ответ 11

Эта функция будет печатать стек, сообщающий вам, откуда он был вызван:

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.

Это поможет вам найти, где вы включаете класс из нескольких раз в сложный проект.

Ответ 12

Просто делайте одно, когда вы включаете или требуете имя файла, а именно class.login.php. Вы можете включить его следующим образом:

include_once class.login.php or 
require_once class.login.php

Таким образом, он никогда не выдает ошибку.

Ответ 13

Использовали ли вы Zend Framework? У меня тоже проблема.
Я решил это, комментируя следующую строку в config/application.ini:

;includePaths.library = APPLICATION_PATH "/../library"

Надеюсь, это поможет вам.

Ответ 14

Другой возможный виновник - это контроль источника и неразрешенные конфликты. SVN может привести к тому, что один и тот же класс появится дважды в конфликтующем файле кода; две альтернативные версии ( "мои" и "их" ).

Ответ 15

Я столкнулся с той же проблемой: более новая версия php не имеет одинакового отношения с множественным включением одного и того же файла (как библиотеки), поэтому теперь мне нужно изменить все мои включения некоторыми include_once.

Или эти трюки могут помочь, если у вас слишком много уроков в вашей библиотеке...

if( class_exists('TestClass') != true )
{
   //your definition of TestClass
}

Ответ 16

У меня была такая же проблема: "PHP Fatal error: Невозможно переопределить класс XYZ.php".

У меня есть две каталоги, такие как controller и model, и я загрузил по ошибке XYZ.php в обоих каталогах (так что файл с тем же именем вызывает проблему).

Первое решение:

Найдите весь проект и убедитесь, что у вас есть только один класс XYZ.php.

Второе решение:

Добавьте пространство имен в свой класс, чтобы вы могли использовать одно и то же имя класса.

Ответ 17

Я столкнулся с той же проблемой. выяснилось, что это было имя класса. я справился с этим, изменив имя. следовательно, решение проблемы.

Ответ 18

Я решил проблему со следующим. Надеюсь, это поможет вам немного.

if(!class_exists("gt_core"))
{
    require_once("core.db.class.php");
}

Ответ 19

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