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


162

誰かがこの問題の原因を知っていますか?

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


11
これは、APC +を追加することができます参照してくださいautload stackoverflow.com/questions/4575341/...を
gagarine

5
自動ロードを使用するか、または試すこともできますif(!class_exists('YourClass')){ include 'YourClass.php'; }
Timo Huovinen '18

回答:


117

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

例えば:

class Foo {}

// some code here

class Foo {}

その2番目のFooはエラーをスローします。


75
この回答は、AaronLSの回答ほど役に立ちません。このような明白な繰り返しを(非常に複雑な状況でさえ)書いた場合、質問者が質問をしたとは思いません。include_onceのヒントは、PHPのあいまいな機能を明確にするのに役立ちます。
DavidHyogo 2013年

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

4
include_once( 'FooBar.php')を使用してクラスを含めます。関数の名前は一目瞭然です。
Marco Matarazzi 14

2
AaronLSの答えははるかに高い評価であり、あなたはここでそれを見つけることができます。
qris 2014年

1
実際、これは問題に完全に答え、それは時代を超えません。AaronLSは仮定を立て、問題を解決しようとしますが、これは多くのより良い方法で解決できます。
TarranJones 2016年

317

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

include_once "something.php";

複数の包含を防ぐため。これは非常に簡単ですが、必ずしも明白ではありませんが、長いファイルチェーンが互いに含まれる可能性があるためです。


10
これは本当に役に立ちました!
Marci-man

4
include_once避けてください。遅いので、代わりにオートローディングのような何かを使用します:)
Timo Huovinen 2012年

21
@Timo私が調べたベンチマークに基づいて、100,000個のinclude_onceのファイルがある場合、約1秒の顕著な違いしかありません。マスターインクルードファイルなどの標準以下の手法を使用してファイルインクルードを時期尚早に最適化するよりも、DBアクセスやその他のロジックを最適化する方が良いでしょう。オートロード機能の動作は大きく異なりません。それぞれの機能は異なり、互換性はありません。どちらか一方をもう一方に使用できますが、同じように機能しない場合があります。
AaronLS 2012

3
@Timoリンクしたページを引用するには、「__ autoload()の使用は推奨されておらず、将来廃止されるか削除される可能性があります」。
AaronLS 2012

1
@AaronLS SOのコメントを編集できません。リンクは、より良い例へのリンクでもあります。APCの開発者のコ​​メントと彼がどのようにinclude_onceを嫌っていたのかを読んだ後、私はそれを提案しました(私は彼に不満を感じました)。また、違いはパフォーマンスだけではありません。
Timo Huovinen、2012

55

これは、ページ内でクラスを2回以上宣言すると発生します。そのクラスをifステートメント(以下のように)でラップするか、別のファイルに入れてのrequire_once()代わりにを使用して修正できますinclude()

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

5
それはclass_exists( 'TestClass')=== falseまたは!class_exist( 'TestClass')です
Jens A. Koch

2
@Jens-AndréKochのコメントで、2番目の例に「s」がありません->それは、class_exists('TestClass') === falseまたは!class_exists('TestClass')
furins

そうだね。ご指摘いただきありがとうございます。もう編集できません。タイムアウト。
Jens A. Koch

このロジックをありがとう。
フランク

21

使用include_once();-これにより、コードは1回だけ含まれます。


15

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


ここでの黄金の答え-私が使用しているのと同じクラス名がPHPにあるとは思わなかった!
ジェイミーM

12

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


2
これは、すでに受け入れられ、非常に賛成されている回答に対するコメントであるべきです
Yaroslav

8

PHPのFastCGIのいくつかのバグが原因で発生することもあります。

再起動してみてください。Ubuntuでは次のとおりです。

service php-fastcgi restart

わかりました。それは解決策ですが、問題は修正されません。私の場合、問題は月に1〜2回ランダムに発生します。:(
SkaJess、2015年

@SkaJess-crontabに再起動コマンドを追加して、1時間ごとに再起動できます。ダーティ-サイトの最大ダウンタイムが1時間であることを保証します。
luchaninov 2015年

@方法-phpが仕事中に落ちているので、それは私にとって良い解決策ではありません。ある意味では、毎日夜間に再起動コマンドを追加すると思います。2番目の方法では、IISとPHPのアップグレードを検討します。
SkaJess、2015年

6

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;では両方のファイルで名前空間の互換性を維持することです。


3

追加するだけ。

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


3

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


3

ファイル名、つまりclass.login.phpを含めたり要求したりするときは、必ず1つのことを行ってください。このように含めることができます:

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

これにより、エラーがスローされることはありません。


2

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

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) { ... }がスコープ内の1レベル下に移動します。次に、PHPの致命的なエラーの前に2つのトレースを取得する必要があります。

これは、クラスが複雑なプロジェクトの複数回に含まれている場所を見つけるのに役立ちます。


1

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

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

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


1

別の考えられる原因は、ソース管理と未解決の競合です。SVNにより、競合するコードファイルに同じクラスが2回表示される場合があります。それの2つの代替バージョン(「鉱山」と「彼ら」)。


1

私は同じ問題に遭遇しました:新しいphpバージョンは(ライブラリーとして)同じファイルの複数のインクルードを同じように処理しないので、いくつかのinclude_onceによってすべてのインクルードを変​​更する必要があります。

または、このトリックは、ライブラリにクラスが多すぎない場合に役立ちます...

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

1

「PHPの致命的なエラー:クラスXYZ.phpを再宣言できません」という同じ問題が発生しました。

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

最初の解決策:

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

2番目の解決策:

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


0

私は同じ問題に遭遇しました。ケースがクラス名であることがわかりました。名前を変えて対処しました。したがって、問題を解決します。


0

これは実際には、クラスがページですでに宣言されていて、それを再作成しようとしていることを意味します。

簡単な方法は次のとおりです。

以下の方法で問題を解決しました。これが少し役立つことを願っています。

if(!class_exists("testClassIfExist"))
{
    require_once("testClassIfExist.php");
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.