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

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

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


person Jin Yong    schedule 02.04.2009    source источник
comment
Это можно добавить с помощью APC + autload см. stackoverflow.com/questions/4575341/   -  person gagarine    schedule 04.03.2012
comment
Воспользуйтесь автозагрузкой или попробуйте if(!class_exists('YourClass')){ include 'YourClass.php'; }   -  person Timo Huovinen    schedule 18.09.2012


Ответы (18)


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

Например:

class Foo {}

// some code here

class Foo {}

Второй Foo вызовет ошибку.

person whichdan    schedule 02.04.2009
comment
Этот ответ не так полезен, как ответ AaronLS. Я не думаю, что спрашивающий задал бы вопрос, если бы он написал очевидное повторение, подобное этому (даже в довольно сложной ситуации). Совет include_once помогает прояснить непонятную особенность PHP. - person DavidHyogo; 20.03.2013
comment
Эта ошибка также может возникнуть, если вы определите метод __construct более одного раза. - person Jack Trowbridge; 02.09.2013
comment
Просто используйте include_once ('FooBar.php'), чтобы включить свой класс. Название функции говорит само за себя. - person MataMix; 19.02.2014
comment
Ответ AaronLS имеет гораздо более высокий рейтинг, и вы можете найти его здесь < / а>. - person qris; 07.10.2014
comment
Здесь внизу, как в - ответ прямо под этим. - person Jayden Lawson; 15.05.2015
comment
На самом деле это прекрасно отвечает на вопрос, и это вне времени, AaronLS делает предположение, а затем пытается решить проблему, которая теперь может быть решена многими лучшими способами. - person TarranJones; 11.05.2016
comment
Еще одно дополнение - если вы используете автозагрузку PSR-4 и пространство имен в файле не соответствует пространству имен, используемому для разрешения класса, в котором вы его создаете, вы получите эту ошибку. - person HorusKol; 06.12.2017

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

include_once "something.php";

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

person AaronLS    schedule 02.04.2009
comment
это была действительно полная помощь! - person Marci-man; 06.08.2011
comment
избегайте include_once, это медленно, используйте вместо этого что-нибудь другое, например автозагрузку :) - person Timo Huovinen; 26.01.2012
comment
@Timo Судя по тестам, на которые я смотрел, заметная разница в 1 секунду будет только в том случае, если у вас есть файл с 100 000 include_once. Лучше оптимизировать доступ к БД или другую логику, чем преждевременно оптимизировать файл, используя нестандартные методы, такие как основные включаемые файлы. Функция автозагрузки не сильно отличается. Каждый из них работает по-своему и не является взаимозаменяемым. Вы можете использовать одно для другого, но бывают случаи, когда они не работают одинаково. - person AaronLS; 18.09.2012
comment
@Timo Не рекомендуется цитировать страницу, на которую вы указали ссылку с помощью __autoload (), и в будущем она может быть исключена или удалена. - person AaronLS; 18.09.2012
comment
@AaronLS Не могу редактировать комментарии к SO, ссылка также ведет на лучший пример. Я предложил это после того, как прочитал комментарии разработчиков APC и то, как он ненавидел include_once (мне было жаль его). Кроме того, разница не только в производительности. - person Timo Huovinen; 18.09.2012
comment
Чтобы узнать, где было объявление первого класса, используйте этот ответ: stackoverflow.com/a/2420104/1939671 - person bumerang; 23.08.2019

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

if (!class_exists('TestClass')) {
   // Put class TestClass here
}
person Sam    schedule 02.04.2009
comment
это class_exists ('TestClass') === false или! class_exist ('TestClass') - person Jens A. Koch; 16.08.2012
comment
В комментарии @ Jens-AndréKoch во втором примере отсутствует s - ›это class_exists('TestClass') === false или !class_exists('TestClass') - person furins; 08.08.2013
comment
Правда. Спасибо что подметил это. Больше не редактируется .. тайм-аут. - person Jens A. Koch; 08.08.2013
comment
Спасибо за такую ​​логику. - person Frank; 13.12.2018

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

person farhad    schedule 15.07.2011

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

person Ajeesh    schedule 30.01.2010
comment
Здесь для меня золотой ответ - я даже не думал, что у PHP могло быть то же имя класса, что и я! - person Jamie M; 11.05.2016

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

person yonicsurny    schedule 08.07.2012
comment
Это должен быть комментарий к уже принятому и получившему большое количество голосов. - person Yaroslav; 11.10.2012

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

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

service php-fastcgi restart
person luchaninov    schedule 04.07.2011
comment
Хорошо, это решение, но оно не решает проблему. В моем случае проблема возникает случайным образом один или два раза в месяц. :( - person SkaJess; 23.01.2015
comment
@SkaJess - вы можете добавить команду перезапуска в crontab для ежечасного перезапуска. грязный - но гарантирует, что максимальное время простоя вашего сайта составит 1 час. - person luchaninov; 24.01.2015
comment
@how - для меня это не очень хорошее решение, потому что php в течение рабочего дня падает. Я думаю, что в одном случае я добавлю команду перезапуска ежедневно в ночное время. Во втором случае я рассмотрю возможность обновления IIS и PHP. - person SkaJess; 30.01.2015

Просто добавляю;

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

person bretddog    schedule 23.11.2011

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

person Juri Sinitson    schedule 20.04.2012

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

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

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

person Asraful Haque    schedule 20.06.2016

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

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.

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

person mpen    schedule 18.07.2013

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

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

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

person Praditha    schedule 14.11.2011

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

person Konrad Morawski    schedule 23.10.2012

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

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

if( class_exists('TestClass') != true )
{
   //your definition of TestClass
}
person Alexandre Mazel    schedule 12.11.2014

У меня была такая же проблема. Неустранимая ошибка PHP: невозможно повторно объявить класс XYZ.php.

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

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

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

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

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

person Muhammad Shahzad    schedule 11.04.2017

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

person R T    schedule 04.07.2011

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

Вот простой метод.

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

if(!class_exists("testClassIfExist"))
{
    require_once("testClassIfExist.php");
}
person mohitesachin217    schedule 25.12.2014

Вы должны использовать функцию require_once ().

person Ashnet    schedule 04.11.2020
comment
Я просмотрел другие ответы в этой теме, и мне кажется, что this, this и this также упоминает require_once(). Вы можете объяснить, чем отличается ваш ответ? - person Scratte; 05.11.2020