web-dev-qa-db-ja.com

PHP致命的なエラー:クラスを再宣言できません

誰もがこの問題を引き起こす可能性があることを知っていますか?

PHP致命的エラー:クラスを再宣言できません

159
Jin Yong

それはあなたがすでにクラスを作成したことを意味します。

例えば:

class Foo {}

// some code here

class Foo {}

その2番目のFooはエラーを投げます。

116
whichdan

同じ名前のクラスが複数回宣言されています。たぶん複数のインクルードを介して。他のファイルをインクルードするときは、次のようなものを使う必要があります。

include_once "something.php";

多重包含を防ぐため。これが起こるのは非常に簡単です、いつも明白であるというわけではありません、あなたがお互いに含まれているファイルの長い連鎖を持つことができるので。

311
AaronLS

これは、ページ内でクラスを複数回宣言すると発生します。そのクラスをifステートメントでラップすることで(以下のように)解決することも、別のファイルに入れてrequire_once()ではなくinclude()を使用することもできます。

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

include_once();を使用してください - これで、あなたのコードは一度だけ含まれるでしょう。

20
farhad

これは、phpライブラリの組み込みクラスのいずれかを使用した場合に起こります。ディレクトリ名としてクラス名を使用しましたが、同じエラーが発生しました。最初にエラーが発生した場合は、使用するクラス名が組み込みクラスの1つではないことを確認してください。

15
Ajeesh

このエラーは、__constructメソッドを複数回定義した場合にも発生する可能性があります。

12
yonicsurny

PHP FastCGIのバグが原因で発生する場合があります。

再起動してみてください。 Ubuntuで:

service php-fastcgi restart
8
luchaninov

次のようにautoloadを使用しているときに同じ問題がありました。

<?php

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


__autoload("MyClass1");

$obj = new MyClass1();

?>

そして他のクラスではありました:

namespace testClassNamespace;


class MyClass1
{

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

解決策は、名前空間の互換性を維持することです。私の例では、両方のファイルにnamespace testClassNamespace;があります。

6
Jacob

追加するだけです。

このエラーは、誤って関数を別の関数の中に入れた場合にも発生する可能性があります。

3
bretddog

PHP 5.3(私も古いバージョンだと思います)は、異なる場合に同じ名前で問題があるようです。だから私はクラスLoginとそれがLogInを実装するインターフェースを持っていたときにこの問題を抱えていた。 LogInをLog_Inに変更した後、問題は解決しました。

3
Juri Sinitson

Class.login.phpなど、ファイル名を含めるとき、または要求するときは、1つだけを実行してください。このように含めることができます。

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

これにより、エラーが発生することはありません。

3
Asraful Haque

この関数はどこから呼び出されたのかを示すスタックを表示します。

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

クラスを含むファイルの先頭でこの関数を呼び出します。

クラスが2回以上含まれていても、1回だけ印刷されることがあります。これは、PHPが実際にはコードを実行する前にファイル内のすべての最上位クラスを解析し、すぐに致命的なエラーをスローするためです。これを解決するには、クラス宣言をif(true) { ... }でラップします。これにより、クラスはスコープ内のあるレベルに移動します。それから、PHP致命的エラーの前に2つのトレースを取得する必要があります。

これはあなたがあなたのクラスが複雑なプロジェクトで何度も含まれている場所を見つけるのを助けるべきです。

2
mpen

私は同じ問題「PHP致命的なエラー:クラスXYZ.phpを再宣言することはできません」を持っていました。

controllermodelのような2つのディレクトリがあり、両方のディレクトリに誤ってXYZ.phpでアップロードしました(したがって、同じ名前のファイルで問題が発生します)。

最初の解決策:

プロジェクト全体を検索し、クラスXYZ.phpが1つだけあることを確認してください。

第二の解決策:

クラスに名前空間を追加して、同じクラス名を使用できるようにします。

1

Zend Frameworkを使用しましたか?私も同じ問題を抱えています。
これをconfig/application.iniの次の行をコメントアウトすることで解決しました:

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

これがお役に立てば幸いです。

1
Praditha

考えられるもう1つの原因は、ソース管理と未解決の競合です。 SVNは衝突したコードファイルに同じクラスを2回出現させるかもしれません。それの2つの代替バージョン( "mine"と "theirs")。

1
Konrad Morawski

私は同じ問題に遭遇しました:新しいバージョンのphpは同じファイルを(ライブラリとして)複数インクルードしても同じことをしないので、今度はinclude_onceによってインクルードをすべて変更しなければなりません。

ライブラリにあまりにも多くのクラスがない場合は、このテクニックが役に立ちます。

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

私は同じ問題に遭遇しました。ケース名はクラス名でした。私は名前を変えることによってそれに対処した。それ故に問題を解決する。

0
R T

実際には、クラスはすでにページ内で宣言されており、あなたはそれを再作成しようとしています。

簡単なテクニックは以下の通りです。

私は以下で問題を解決しました。これがあなたに少し役立つことを願っています。

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