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



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




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


961   18  

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. После того, как я переименовал 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");
}

Comments

    Ничего не найдено.