Php: Cannot Declare Class Because the Name Is Already in Use

I have 5 scripts:

  1. database.php
  2. parent.php
  3. child1.php
  4. child2.php
  5. somescript.php

parent.php class looks like this:

include 'database.php';

class Parent {
    public $db;
    function __construct() {
        $this->db = new Database();
    }
}

The child1.php and child2.php classes looks like this:

include 'parent.php';

class Child1 extends Parent {
    function __construct() {
        parent::__construct();
    }

    function useDb() {
        $this->db->some_db_operation();
    }
}

The problem

When I try to include both child1 and child2 in somescript.php, it returns the following error:

cannot declare class Database because the name is already in use in database.php on line 4 (this is the line which contains words 'class Database')

But if I include only a single file (child1 or child2), it works great.

How do I correct that?

0

6 Answers

You want to use include_once() or require_once(). The other option would be to create an additional file with all your class includes in the correct order so they don't need to call includes themselves:

"classes.php"

include 'database.php';
include 'parent.php';
include 'child1.php';
include 'child2.php';

Then you just need:

require_once('classes.php');
4

try to use use include_onceor require_once instead of include or require

Another option to include_once or require_once is to use class autoloading.

You should use require_once and include_once. Inside parent.php use

include_once 'database.php';

And inside child1.php and child2.php use

include_once 'parent.php';

Class Parent cannot be declared because it is PHP reserved keyword so in effect it's already in use

1

I had this problem before and to fix this, Just make sure :

  1. You did not create an instance of this class before
  2. If you call this from a class method, make sure the __destruct is set on the class you called from.

My problem (before) :
I had class : Core, Router, Permissions and Render Core include's the Router class, Router then calls Permissions class, then Router __destruct calls the Render class and the error "Cannot declare class because the name is already in use" appeared.

Solution :
I added __destruct on Permission class and the __destruct was empty and it's fixed...

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Marcus Vance

Marcus Vance

Cybersecurity & Digital Privacy Researcher

Marcus Vance is a cybersecurity auditor and technology writer dedicated to educating the public about online safety, data privacy regulations, enterprise security, and emerging cyber threats.

Share this article
Twitter Facebook Pinterest