誰かがこの問題の原因を知っていますか?
PHPの致命的なエラー:クラスを再宣言できません
if(!class_exists('YourClass')){ include 'YourClass.php'; }
誰かがこの問題の原因を知っていますか?
PHPの致命的なエラー:クラスを再宣言できません
if(!class_exists('YourClass')){ include 'YourClass.php'; }
回答:
それはあなたがすでにクラスを作成したことを意味します。
例えば:
class Foo {}
// some code here
class Foo {}
その2番目のFooはエラーをスローします。
同じ名前のクラスが複数回宣言されています。多分複数のインクルードを介して。他のファイルを含めるときは、次のようなものを使用する必要があります
include_once "something.php";
複数の包含を防ぐため。これは非常に簡単ですが、必ずしも明白ではありませんが、長いファイルチェーンが互いに含まれる可能性があるためです。
これは、ページ内でクラスを2回以上宣言すると発生します。そのクラスをifステートメント(以下のように)でラップするか、別のファイルに入れてのrequire_once()
代わりにを使用して修正できますinclude()
。
if (!class_exists('TestClass')) {
// Put class TestClass here
}
class_exists('TestClass') === false
または!class_exists('TestClass')
このエラーは、__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";
}
}
解決策は、私の例namespace testClassNamespace;
では両方のファイルで名前空間の互換性を維持することです。
ファイル名、つまりclass.login.phpを含めたり要求したりするときは、必ず1つのことを行ってください。このように含めることができます:
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回以上含まれている場合でも、1回だけ印刷されることがあります。これは、PHPがコードを実行する前にファイル内のすべての最上位クラスを実際に解析し、すぐに致命的なエラーをスローするためです。これを修正するには、クラス宣言をif(true) { ... }
がスコープ内の1レベル下に移動します。次に、PHPの致命的なエラーの前に2つのトレースを取得する必要があります。
これは、クラスが複雑なプロジェクトの複数回に含まれている場所を見つけるのに役立ちます。
別の考えられる原因は、ソース管理と未解決の競合です。SVNにより、競合するコードファイルに同じクラスが2回表示される場合があります。それの2つの代替バージョン(「鉱山」と「彼ら」)。
私は同じ問題に遭遇しました:新しいphpバージョンは(ライブラリーとして)同じファイルの複数のインクルードを同じように処理しないので、いくつかのinclude_onceによってすべてのインクルードを変更する必要があります。
または、このトリックは、ライブラリにクラスが多すぎない場合に役立ちます...
if( class_exists('TestClass') != true )
{
//your definition of TestClass
}
「PHPの致命的なエラー:クラスXYZ.phpを再宣言できません」という同じ問題が発生しました。
およびのような2つのディレクトリがcontroller
ありmodel
、誤って両方のディレクトリにXYZ.phpをアップロードしました(同じ名前のファイルが原因で問題が発生します)。
プロジェクト全体を見つけて、XYZ.phpクラスが1つだけあることを確認してください。
同じクラス名を使用できるように、クラスに名前空間を追加します。
これは実際には、クラスがページですでに宣言されていて、それを再作成しようとしていることを意味します。
簡単な方法は次のとおりです。
以下の方法で問題を解決しました。これが少し役立つことを願っています。
if(!class_exists("testClassIfExist"))
{
require_once("testClassIfExist.php");
}