誰もがこの問題を引き起こす可能性があることを知っていますか?
PHP致命的エラー:クラスを再宣言できません
それはあなたがすでにクラスを作成したことを意味します。
例えば:
class Foo {}
// some code here
class Foo {}
その2番目のFooはエラーを投げます。
同じ名前のクラスが複数回宣言されています。たぶん複数のインクルードを介して。他のファイルをインクルードするときは、次のようなものを使う必要があります。
include_once "something.php";
多重包含を防ぐため。これが起こるのは非常に簡単です、いつも明白であるというわけではありません、あなたがお互いに含まれているファイルの長い連鎖を持つことができるので。
これは、ページ内でクラスを複数回宣言すると発生します。そのクラスをifステートメントでラップすることで(以下のように)解決することも、別のファイルに入れてrequire_once()
ではなくinclude()
を使用することもできます。
if (!class_exists('TestClass')) {
// Put class TestClass here
}
include_once();
を使用してください - これで、あなたのコードは一度だけ含まれるでしょう。
これは、phpライブラリの組み込みクラスのいずれかを使用した場合に起こります。ディレクトリ名としてクラス名を使用しましたが、同じエラーが発生しました。最初にエラーが発生した場合は、使用するクラス名が組み込みクラスの1つではないことを確認してください。
このエラーは、__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;
があります。
追加するだけです。
このエラーは、誤って関数を別の関数の中に入れた場合にも発生する可能性があります。
PHP 5.3(私も古いバージョンだと思います)は、異なる場合に同じ名前で問題があるようです。だから私はクラスLoginとそれがLogInを実装するインターフェースを持っていたときにこの問題を抱えていた。 LogInをLog_Inに変更した後、問題は解決しました。
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) { ... }
でラップします。これにより、クラスはスコープ内のあるレベルに移動します。それから、PHP致命的エラーの前に2つのトレースを取得する必要があります。
これはあなたがあなたのクラスが複雑なプロジェクトで何度も含まれている場所を見つけるのを助けるべきです。
私は同じ問題「PHP致命的なエラー:クラスXYZ.phpを再宣言することはできません」を持っていました。
controller
とmodel
のような2つのディレクトリがあり、両方のディレクトリに誤ってXYZ.phpでアップロードしました(したがって、同じ名前のファイルで問題が発生します)。
プロジェクト全体を検索し、クラスXYZ.phpが1つだけあることを確認してください。
クラスに名前空間を追加して、同じクラス名を使用できるようにします。
Zend Frameworkを使用しましたか?私も同じ問題を抱えています。
これをconfig/application.ini
の次の行をコメントアウトすることで解決しました:
;includePaths.library = APPLICATION_PATH "/../library"
これがお役に立てば幸いです。
考えられるもう1つの原因は、ソース管理と未解決の競合です。 SVNは衝突したコードファイルに同じクラスを2回出現させるかもしれません。それの2つの代替バージョン( "mine"と "theirs")。
私は同じ問題に遭遇しました:新しいバージョンのphpは同じファイルを(ライブラリとして)複数インクルードしても同じことをしないので、今度はinclude_onceによってインクルードをすべて変更しなければなりません。
ライブラリにあまりにも多くのクラスがない場合は、このテクニックが役に立ちます。
if( class_exists('TestClass') != true )
{
//your definition of TestClass
}
私は同じ問題に遭遇しました。ケース名はクラス名でした。私は名前を変えることによってそれに対処した。それ故に問題を解決する。
実際には、クラスはすでにページ内で宣言されており、あなたはそれを再作成しようとしています。
簡単なテクニックは以下の通りです。
私は以下で問題を解決しました。これがあなたに少し役立つことを願っています。
if(!class_exists("testClassIfExist"))
{
require_once("testClassIfExist.php");
}