web-dev-qa-db-ja.com

PHP:名前がすでに使用されているため、クラスを宣言できません

5つのスクリプトがあります。たとえば、database.php、parent.php、child1.php、child2.php、およびsomescript.phpがあります。

parent.phpクラスは次のようになります。

include 'database.php';

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

child1およびchild2クラスは次のようになります。

include 'parent.php';

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

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

問題

Somescript.phpにchild1とchild2の両方を含めると、次のエラーが返されます。

クラスDatabaseを宣言することはできません。名前はすでに4行目のdatabase.phpで使用されているためです(これは「class Database」という単語を含む行です)

ただし、1つのファイル(child1またはchild2)のみを含めると、うまく機能します。

どうすれば修正できますか?

27
egorik

include_once() または require_once() を使用する場合。他のオプションは、すべてのクラスインクルードが正しい順序で追加ファイルを作成し、インクルード自体を呼び出す必要がないようにすることです。

「classes.php」

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

次に、あなただけが必要です:

require_once('classes.php');
28
M31

includeまたはrequireの代わりにinclude_onceまたはrequire_onceを使用してみてください

8

Include_onceまたはrequire_onceの別のオプションは、クラスのオートロードを使用することです。 http://php.net/manual/en/language.oop5.autoload.php

2
Fergal Andrews

私は前にこの問題を抱えていましたが、これを修正するために、ただ確認してください:

  1. 以前にこのクラスのインスタンスを作成していません
  2. これをクラスメソッドから呼び出す場合は、呼び出し元のクラスに__destructが設定されていることを確認してください。

私の問題(前):
[。登場しました。

解決 :
Permissionクラスに__destructを追加しましたが、__ destructは空で、修正されました...

0
PlanetCloud