174

Does anyone know what can cause this problem?

PHP Fatal error: Cannot redeclare class

2
  • 11
    This can append with APC + autload see stackoverflow.com/questions/4575341/… Commented Mar 4, 2012 at 17:04
  • 6
    Use autoload, or you can also try if(!class_exists('YourClass')){ include 'YourClass.php'; } Commented Sep 18, 2012 at 17:28

19 Answers 19

320

You have a class of the same name declared more than once. Maybe via multiple includes. When including other files you need to use something like

include_once "something.php";

to prevent multiple inclusions. It's very easy for this to happen, though not always obvious, since you could have a long chain of files being included by one another.

Sign up to request clarification or add additional context in comments.

6 Comments

this was really help full!
avoid include_once, it's slow, use something else instead, like autoloading :)
@Timo Based on benchmarks I've looked at, there will only be a noticeable difference of about 1 second if you have a file with 100,000 include_once's. You would be better off optimizing your DB access or other logic than prematurely optimizing your file includes using substandard techniques like master include files. The autoload feature doesn't perform significantly differently. Each functions differently, and are not interchangeably appropriate. You can use one for the other, but there are corner cases where they do not function the same.
@Timo To quote the page you linked "using __autoload() is discouraged and may be deprecated or removed in the future."
@AaronLS Can't edit comments on SO, the link also links to the better example. I suggested it after reading APC's developers comments and how he hated include_once (I felt bad for him). Also the difference is beyond just performance.
|
119

It means you've already created a class.

For instance:

class Foo {}

// some code here

class Foo {}

That second Foo would throw the error.

7 Comments

This answer is not as helpful as AaronLS's. I don't think the questioner would have asked the question if (s)he had written an obvious repetition like this (even in quite a complex situation). The include_once tip helps to clarify an obscure feature of PHP.
This error might also occur if you define the __construct method more than once.
Just use include_once('FooBar.php') to include your class. The name of the function is self-explanatory.
AaronLS's answer is much higher rated, and you can find it way down here.
Actually this answers the question perfectly and it is timeless, AaronLS makes an assumption then attempts to solve the problem which can now be solved many better ways.
|
58

That happens when you declare a class more than once in a page. You can fix it by either wrapping that class with an if statement (like below), or you can put it into a separate file and use require_once(), instead of include().

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

3 Comments

it's class_exists('TestClass') === false or !class_exist('TestClass')
In @Jens-AndréKoch comment a "s" is missing in the second example --> it's class_exists('TestClass') === false or !class_exists('TestClass')
True. Thanks for pointing that out. Not editable anymore.. timeout.
20

Use include_once(); - with this, your codes will be included only one time.

Comments

15

This will happen if we use any of the in built classes in the php library. I used the class name as Directory and I got the same error. If you get error first make sure that the class name you use is not one of the in built classes.

1 Comment

Golden answer in here for me - I didn't even think PHP might have had the same class name as I was using!
12

This error might also occur if you define the __construct method more than once.

1 Comment

This should be a comment on the already accepted and highly upvoted answer
8

Sometimes that happens due to some bugs in PHP's FastCGI.

Try to restart it. At Ubuntu it's:

service php-fastcgi restart

3 Comments

Ok, it's a solution but it doesn't correct the problem And in my case, the problem appears randomly one or two times by month. :(
@SkaJess - you can add restart command to crontab to restart hourly. dirty - but will assure that max downtime of your site will be 1 hour.
@how - it's not a good solution for me because php is falling down during the working day. I think that in one way that I'll add restart command daily during the night. In the second way, i ll consider to upgrade IIS and PHP.
6

I had the same problem while using autoload like follows:

<?php

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


__autoload("MyClass1");

$obj = new MyClass1();

?>

and in other class there was:

namespace testClassNamespace;


class MyClass1
{

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

The sollution is to keep namespace compatibility, in my example namespace testClassNamespace; in both files.

Comments

3

Just adding;

This error can also occur if you by mistake put a function inside another function.

Comments

3

PHP 5.3 (an I think older versions too) seems to have problem with same name in different cases. So I had this problem when a had the class Login and the interface it implements LogIn. After I renamed LogIn to Log_In the problem got solved.

Comments

3

Just do one thing whenever you include or require filename namely class.login.php. You can include it this way:

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

This way it never throws an error.

Comments

2

This function will print a stack telling you where it was called from:

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

Call this function at the top of the file that includes your class.

Sometimes it will only print once, even though your class is being included two or more times. This is because PHP actually parses all the top-level classes in a file before executing any code and throws the fatal error immediately. To remedy this, wrap your class declaration in if(true) { ... }, which will move your class down a level in scope. Then you should get your two traces before PHP fatal errors.

This should help you find where you class is being included from multiple times in a complex project.

Comments

1

Did You use Zend Framework? I have the same problem too.
I solved it by commenting out this the following line in config/application.ini:

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

I hope this will help you.

Comments

1

Another possible culprit is source control and unresolved conflicts. SVN may cause the same class to appear twice in the conflicted code file; two alternative versions of it ("mine" and "theirs").

Comments

1

I have encountered that same problem: newer php version doesn't deal the same with multiple incluse of the same file (as a library), so now I have to change all my include by some include_once.

Or this tricks could help, if you d'ont have too much class in your library...

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

Comments

1

I had the same problem "PHP Fatal error: Cannot redeclare class XYZ.php".

I have two directories like controller and model and I uploaded by mistakenly XYZ.php in both directories.(so file with the same name cause the issue).

First solution:

Find in your whole project and make sure you have only one class XYZ.php.

Second solution:

Add a namespace in your class so you can use the same class name.

Comments

1

It actually means that class is already declared in the page and you are trying to recreate it.

A simple technique is as follow.

I solved the issue with the following. Hope this will help you a bit.

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

Comments

1

You must use require_once() function.

1 Comment

I looked at the other Answers in this thread, and it seems that this, this and this also mentions require_once(). Can you explain how your Answer is different?
0

i have encountered that same problem. found out the case was the class name. i dealt with it by changing the name. hence resolving the problem.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.