В PHP фатальная ошибка: невозможно переопределить класс

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

PHP фатальная ошибка: не удается повторно объявить класс

18 ответов


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

например:

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. Я использовал имя класса в качестве каталога и я получил ту же ошибку. Если вы получаете ошибку, сначала убедитесь, что имя класса, которое вы используете, не является одним из встроенных классов.


эта ошибка также может возникнуть при определении __construct способ более одного раза.


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

попробуйте перезапустить его. В 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 (я думаю, что и более старые версии), похоже, имеют проблемы с тем же именем в разных случаях. Поэтому у меня была эта проблема, когда у A был логин класса и интерфейс, который он реализует логин. После того, как я переименовал 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.

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


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

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

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


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

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

Я надеюсь, что это поможет вам.


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


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

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

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

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

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

первый вариант:

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

второй вариант:

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


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


Это фактически означает, что класс уже объявлен на странице и вы пытаетесь воссоздать его.

простой метод заключается в следующем.

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

if(!class_exists("testClassIfExist"))
{
    require_once("testClassIfExist.php");
}