174

Does anyone know what can cause this problem?

PHP Fatal error: Cannot redeclare class

2

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.

6
  • 10
    this was really help full!
    – Marci-man
    Commented Aug 6, 2011 at 17:49
  • 4
    avoid include_once, it's slow, use something else instead, like autoloading :) Commented Jan 26, 2012 at 9:41
  • 21
    @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.
    – AaronLS
    Commented Sep 18, 2012 at 5:19
  • 3
    @Timo To quote the page you linked "using __autoload() is discouraged and may be deprecated or removed in the future."
    – AaronLS
    Commented Sep 18, 2012 at 5:20
  • 1
    @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. Commented Sep 18, 2012 at 16:34
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
  • 76
    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.
    – DavidHyogo
    Commented Mar 20, 2013 at 2:12
  • 2
    This error might also occur if you define the __construct method more than once. Commented Sep 1, 2013 at 21:27
  • 4
    Just use include_once('FooBar.php') to include your class. The name of the function is self-explanatory.
    – MataMix
    Commented Feb 19, 2014 at 13:49
  • 2
    AaronLS's answer is much higher rated, and you can find it way down here.
    – qris
    Commented Oct 7, 2014 at 11:48
  • 1
    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. Commented May 11, 2016 at 11:32
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
}
4
  • 5
    it's class_exists('TestClass') === false or !class_exist('TestClass') Commented Aug 15, 2012 at 22:58
  • 2
    In @Jens-AndréKoch comment a "s" is missing in the second example --> it's class_exists('TestClass') === false or !class_exists('TestClass')
    – furins
    Commented Aug 8, 2013 at 16:08
  • True. Thanks for pointing that out. Not editable anymore.. timeout. Commented Aug 8, 2013 at 17:07
  • Thanks for this logic.
    – Frank
    Commented Dec 13, 2018 at 14:00
20

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

0
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
  • Golden answer in here for me - I didn't even think PHP might have had the same class name as I was using!
    – Jamie M
    Commented May 11, 2016 at 12:16
12

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

1
  • 2
    This should be a comment on the already accepted and highly upvoted answer
    – Yaroslav
    Commented Oct 10, 2012 at 21:04
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
  • 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
    Commented Jan 23, 2015 at 8:24
  • @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.
    – luchaninov
    Commented Jan 24, 2015 at 11:42
  • @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.
    – SkaJess
    Commented Jan 30, 2015 at 13:04
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.

3

Just adding;

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

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.

0
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.

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.

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.

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").

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
}
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.

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");
}
1

You must use require_once() function.

1
  • 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?
    – Scratte
    Commented Nov 4, 2020 at 22:16
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.

Not the answer you're looking for? Browse other questions tagged or ask your own question.