PHPの致命的なエラー:クラスを再宣言することはできません
-
22-08-2019 - |
質問
誰もがこの問題を引き起こす可能性が何を知っていますか?
PHPの致命的なエラー:クラスを再宣言することはできません。
解決
それはあなたのクラスを既に作成したことを意味します。
たとえばます:
class Foo {}
// some code here
class Foo {}
二fooはエラーをスローすることをます。
他のヒント
あなたは、同じ名前のクラスが複数回宣言しています。たぶん、複数の経由含まれています。他のファイルを含む場合は、あなたのようなものを使用する必要があります。
include_once "something.php";
は、複数の介在物を防ぐために。あなたは、ファイルの長鎖が相互に含まれているかもしれないので、それは、必ずしも明らかではないが、この現象が発生するのは非常に簡単です。
これは起こります。
あなたはどちらか(下記のように)if文でそのクラスをラップすることにより、それを修正したり、別のファイルにそれを置くとrequire_once()
を使用し、代わりにinclude()
のことができます。
if (!class_exists('TestClass')) {
// Put class TestClass here
}
include_once();
を使用する - これで、あなたのコードは一度だけ含まれます。
この現象が発生します。私は、ディレクトリとしてクラス名を使用すると私は同じエラーを得ました。あなたがエラーを取得する場合は、まず使用するクラス名が構築されたクラス内の一つではないことを確認してください。
__construct
メソッドを定義する場合は、このエラーが発生する可能性があります。
時々、PHPのFastCGIの中にいくつかのバグが原因で起こること。
それを再起動してください。 Ubuntuのではそれがあります:
service php-fastcgi restart
autoload
を使用している間、次のように私は同じ問題を抱えています:
<?php
function __autoload($class_name)
{
include $class_name . '.php';
}
__autoload("MyClass1");
$obj = new MyClass1();
?>
や他のクラスにありました:
namespace testClassNamespace;
class MyClass1
{
function __construct()
{
echo "MyClass1 constructor";
}
}
sollutionは、両方のファイルで私の例のnamespace testClassNamespace;
では、名前空間の互換性を維持することです。
ただ、追加;
あなたが誤って別の関数の中の関数を入れる場合は、このエラーが発生する可能性があります。
PHP 5.3は、(私はあまりにも古いバージョンを考えて)別の例では、同じ名前の問題を抱えているようです。だから私は、クラスのログインと、それはログインを実装するインタフェースを持っていたとき、この問題を抱えていました。私は問題をLog_Inにログインし、名前を変更した後に解決してしまっています。
ちょうどあなたが含まれたときに一つのことを行うか、すなわちclass.login.phpファイル名が必要です。あなたは、このようにそれを含めることができます:
include_once class.login.php or
require_once class.login.php
この方法は、それはエラーをスローすることはありません。
この機能は、それが呼び出されたあなたを伝えるスタックを出力します。
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回以上含まれているにもかかわらず、一度印刷されます。 PHPは、実際に任意のコードを実行する前に、ファイル内のすべてのトップレベルのクラスを解析し、すぐに致命的なエラーをスローするためです。これを解決するには、あなたのクラス宣言は、スコープのレベルを自分のクラスを下に移動しますた、if(true) { ... }
で包みます。そして、あなたがPHPの致命的なエラーが発生する前に、2つのトレースを取得する必要があります。
これはあなたのクラスは、複雑なプロジェクトで複数回から含まれている場所を見つける必要があります。
あなたは、Zend Frameworkのを使用しましたか?私も同じ問題を抱えている。
私はconfig/application.ini
で、この次の行をコメントアウトすることによってそれを解決します:
;includePaths.library = APPLICATION_PATH "/../library"
私は、これはあなたを助けることを願っています。
別の可能な原因は、ソース管理および未解決の競合です。 SVNは競合コードファイルに2回表示するには、同じクラスの原因になります。その二つの代替バージョン(「鉱山」と「彼ら」)。
私は、同じ問題が発生しました。 新しいPHPのバージョンは、今、私はいくつかのinclude_onceで含まれ、私のすべてを変更する必要があり、(ライブラリなど)は、同じファイルの複数のincluseと同じように扱っていません。
それともD'ONTがあなたのライブラリにあまりにも多くのクラスを持っている場合は、このトリックは、助けることができる...
if( class_exists('TestClass') != true )
{
//your definition of TestClass
}
私は同じ問題「PHPの致命的なエラー:クラスXYZ.phpを再宣言することはできません」を持っています。
私はcontroller
とmodel
のような2つのディレクトリを持っていると私は両方のディレクトリに誤ってXYZ.phpによってアップロードされた。(そうな問題を引き起こすと同じ名前のファイル)。
まず解決策:
あなたのプロジェクト全体で検索し、あなただけの1クラスXYZ.phpを持っていることを確認します。
第二ソリューション:
あなたは同じクラス名を使用できるように、あなたのクラスに名前空間を追加します。
私は、同じ問題に遭遇しました。見つけた場合は、クラス名でした。私は名前を変更することにより、それに対処しました。したがって、問題を解決します。
これは、実際のクラスがすでにページ内で宣言されていて、それを再作成しようとしていることを意味します。
単純な技術は以下の通りである。
私は次のように問題を解決しました。これはあなたに少しを助けることを願っています。
if(!class_exists("testClassIfExist"))
{
require_once("testClassIfExist.php");
}