Erro fatal do PHP: não é possível redefinir a classe

162

Alguém sabe o que pode causar esse problema?

Erro fatal do PHP: não é possível redefinir a classe

Jin Yong
fonte
11
Isso pode anexar com APC + autload ver stackoverflow.com/questions/4575341/...
Gagarine
5
Use o carregamento automático, ou você também pode tentarif(!class_exists('YourClass')){ include 'YourClass.php'; }
Timo Huovinen

Respostas:

117

Isso significa que você já criou uma classe.

Por exemplo:

class Foo {}

// some code here

class Foo {}

Esse segundo Foo lançaria o erro.

whatdan
fonte
75
Esta resposta não é tão útil quanto a do AaronLS. Eu não acho que o questionador teria feito a pergunta se ele havia escrito uma repetição óbvia como essa (mesmo em uma situação bastante complexa). A dica include_once ajuda a esclarecer um recurso obscuro do PHP.
DavidHyogo
2
Este erro também pode ocorrer se você definir o método __construct mais de uma vez.
Jack Trowbridge
4
Basta usar include_once ('FooBar.php') para incluir sua classe. O nome da função é auto-explicativo.
Marco Matarazzi
2
A resposta do AaronLS tem uma classificação muito mais alta e você pode encontrá- lo aqui embaixo .
QRIS
1
Na verdade, isso responde à pergunta perfeitamente e é atemporal, o AaronLS faz uma suposição e tenta resolver o problema que agora pode ser resolvido de muitas maneiras melhores.
TarranJones
317

Você tem uma classe com o mesmo nome declarada mais de uma vez. Talvez através de várias inclusões. Ao incluir outros arquivos, você precisa usar algo como

include_once "something.php";

para impedir várias inclusões. É muito fácil que isso aconteça, embora nem sempre seja óbvio, pois você pode ter uma longa cadeia de arquivos sendo incluídos um pelo outro.

AaronLS
fonte
10
isso foi realmente ajuda completa!
Marci-man
4
Evite include_once , ele é lento, use outra coisa em vez disso, como autoloading :)
Timo Huovinen
21
@Timo Com base nos benchmarks que eu observei, haverá apenas uma diferença notável de cerca de 1 segundo se você tiver um arquivo com 100.000 include_once. Seria melhor otimizar o acesso ao banco de dados ou outra lógica do que otimizar prematuramente o arquivo, usando técnicas abaixo do padrão, como arquivos de inclusão mestre. O recurso de carregamento automático não tem um desempenho significativamente diferente. Cada um funciona de maneira diferente e não é intercambiável. Você pode usar um para o outro, mas há casos em que eles não funcionam da mesma maneira.
AaronLS 18/09/12
3
@Timo Para citar a página que você vinculou "usando __autoload () é desencorajada e pode ser preterida ou removida no futuro."
AaronLS
1
@AaronLS Não é possível editar comentários no SO, o link também contém links para o melhor exemplo . Sugeri isso depois de ler os comentários dos desenvolvedores da APC e como ele odiava o include_once (eu me senti mal por ele). Além disso, a diferença está além do desempenho.
Timo Huovinen
55

Isso acontece quando você declara uma classe mais de uma vez em uma página. Você pode corrigi-lo envolvendo essa classe com uma instrução if (como abaixo), ou pode colocá-lo em um arquivo separado e usá-lo require_once(), em vez de include().

if (!class_exists('TestClass')) {
   // Put class TestClass here
}
Sam
fonte
5
TI da class_exists ( 'testclass') === falsa ou class_exist ( 'TestClass!')
Jens A. Koch
2
Em @ Jens-AndréKoch comentário um "s" está faltando no segundo exemplo -> é class_exists('TestClass') === falseou!class_exists('TestClass')
Furins
Verdade. Obrigado por apontar isso. Não é mais editável .. tempo limite.
Jens A. Koch
Obrigado por essa lógica.
Frank
21

Use include_once();- com isso, seus códigos serão incluídos apenas uma vez.

farhad
fonte
15

Isso acontecerá se usarmos alguma das classes incorporadas na biblioteca php. Usei o nome da classe como Diretório e recebi o mesmo erro. Se você receber um erro, verifique se o nome da classe que você usa não é um das classes incorporadas.

Ajeesh
fonte
Resposta de ouro aqui para mim - eu nem pensei que o PHP poderia ter o mesmo nome de classe que eu estava usando!
Jamie M
12

Este erro também pode ocorrer se você definir o __constructmétodo mais de uma vez.

yonicsurny
fonte
2
Este deve ser um comentário sobre a resposta já aceito e altamente upvoted
Yaroslav
8

Às vezes isso acontece devido a alguns erros no FastCGI do PHP.

Tente reiniciar. No Ubuntu é:

service php-fastcgi restart
luchaninov
fonte
Ok, é uma solução, mas não corrige o problema. No meu caso, o problema aparece aleatoriamente uma ou duas vezes por mês. :(
SkaJess 23/01
@SkaJess - você pode adicionar o comando restart ao crontab para reiniciar a cada hora. sujo - mas garantirá que o tempo de inatividade máximo do seu site seja de 1 hora.
Luchaninov
@how - não é uma boa solução para mim porque o php está caindo durante o dia útil. Eu acho que, de uma maneira, adicionarei o comando restart diariamente durante a noite. Na segunda maneira, considerarei atualizar o IIS e o PHP.
precisa saber é o seguinte
6

Eu tive o mesmo problema ao usar o autoloadseguinte:

<?php

function __autoload($class_name)
{
    include $class_name . '.php';
}


__autoload("MyClass1");

$obj = new MyClass1();

?>

e em outra classe houve:

namespace testClassNamespace;


class MyClass1
{

    function  __construct()
    {
        echo "MyClass1 constructor";
    }
}

A solução é manter a compatibilidade com o namespace, no meu exemplo namespace testClassNamespace;nos dois arquivos.

Jacob
fonte
3

Apenas adicionando;

Este erro também pode ocorrer se, por engano, você colocar uma função dentro de outra função.

bretddog
fonte
3

O PHP 5.3 (acho que versões mais antigas também) parece ter problemas com o mesmo nome em diferentes casos. Então, eu tive esse problema quando tinha a classe Login e a interface que implementa o LogIn. Depois de renomear o LogIn para Log_In, o problema foi resolvido.

Juri Sinitson
fonte
3

Basta fazer uma coisa sempre que incluir ou exigir o nome do arquivo, class.login.php. Você pode incluí-lo desta maneira:

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

Dessa forma, nunca gera um erro.

Asraful Haque
fonte
2

Esta função imprimirá uma pilha informando de onde foi chamada:

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>';
}

Chame essa função na parte superior do arquivo que inclui sua turma.

Às vezes, ele será impresso apenas uma vez, mesmo que sua turma esteja sendo incluída duas ou mais vezes. Isso ocorre porque o PHP realmente analisa todas as classes de nível superior em um arquivo antes de executar qualquer código e gera o erro fatal imediatamente. Para remediar isso, envolva sua declaração de classe if(true) { ... }, o que fará com que sua classe desça um nível no escopo. Então você deve obter seus dois rastreamentos antes dos erros fatais do PHP.

Isso deve ajudá-lo a descobrir onde sua classe está sendo incluída várias vezes em um projeto complexo.

mpen
fonte
1

Você usou o Zend Framework? Eu também tenho o mesmo problema.
Eu resolvi comentando isso na seguinte linha config/application.ini:

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

Eu espero que isso te ajude.

Praditha
fonte
1

Outro possível culpado é o controle de origem e conflitos não resolvidos. SVN pode fazer com que a mesma classe apareça duas vezes no arquivo de código em conflito; duas versões alternativas dele ("meu" e "deles").

Konrad Morawski
fonte
1

Eu encontrei o mesmo problema: a versão mais recente do php não lida da mesma forma com várias inclinações do mesmo arquivo (como uma biblioteca), então agora eu tenho que mudar todas as minhas inclusões por algumas include_once.

Ou esses truques podem ajudar, se você não tiver muita aula em sua biblioteca ...

if( class_exists('TestClass') != true )
{
   //your definition of TestClass
}
Alexandre Mazel
fonte
1

Eu tive o mesmo problema "Erro fatal do PHP: não é possível redefinir a classe XYZ.php".

Eu tenho dois diretórios como controllere modele eu carregado por XYZ.php erroneamente em ambos os diretórios. (Assim arquivo com o mesmo nome causa a questão).

Primeira solução:

Encontre em todo o seu projeto e verifique se você tem apenas uma classe XYZ.php.

Segunda solução:

Adicione um espaço para nome em sua classe para poder usar o mesmo nome de classe.

Muhammad Shahzad
fonte
0

Eu encontrei o mesmo problema. descobriu que o caso era o nome da classe. eu lidei com isso mudando o nome. portanto, resolvendo o problema.

RT
fonte
0

Na verdade, isso significa que a classe já está declarada na página e você está tentando recriá-la.

Uma técnica simples é a seguinte.

Resolvi o problema com o seguinte. Espero que isso ajude um pouco.

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