Kesalahan PHP fatal: Tidak dapat mendeklarasikan ulang kelas

162

Adakah yang tahu apa yang bisa menyebabkan masalah ini?

Kesalahan PHP fatal: Tidak dapat mendeklarasikan ulang kelas

Jin Yong
sumber
11
Ini dapat ditambahkan dengan APC + autload lihat stackoverflow.com/questions/4575341/…
gagarine
5
Gunakan pengisian otomatis, atau Anda juga dapat mencobaif(!class_exists('YourClass')){ include 'YourClass.php'; }
Timo Huovinen

Jawaban:

117

Itu berarti Anda sudah membuat kelas.

Misalnya:

class Foo {}

// some code here

class Foo {}

Foo kedua akan melempar kesalahan.

yang mana
sumber
75
Jawaban ini tidak membantu seperti yang AaronLS. Saya tidak berpikir si penanya akan menanyakan pertanyaan jika dia menulis pengulangan yang jelas seperti ini (bahkan dalam situasi yang cukup kompleks). Tip include_once membantu untuk memperjelas fitur PHP yang tidak jelas.
DavidHyogo
2
Kesalahan ini mungkin juga terjadi jika Anda mendefinisikan metode __construct lebih dari sekali.
Jack Trowbridge
4
Cukup gunakan include_once ('FooBar.php') untuk memasukkan kelas Anda. Nama fungsinya cukup jelas.
Marco Matarazzi
2
Jawaban AaronLS jauh lebih tinggi nilainya, dan Anda bisa menemukannya di sini .
qris
1
Sebenarnya ini menjawab pertanyaan dengan sempurna dan tidak lekang oleh waktu, AaronLS membuat asumsi kemudian mencoba untuk menyelesaikan masalah yang sekarang dapat diselesaikan dengan banyak cara yang lebih baik.
TarranJones
317

Anda memiliki kelas dengan nama yang sama dinyatakan lebih dari sekali. Mungkin melalui beberapa termasuk. Saat menyertakan file lain, Anda perlu menggunakan sesuatu seperti

include_once "something.php";

untuk mencegah beberapa inklusi. Sangat mudah untuk ini terjadi, meskipun tidak selalu jelas, karena Anda bisa memiliki rantai panjang file yang dimasukkan satu sama lain.

AaronLS
sumber
10
ini benar-benar membantu penuh!
Marci-man
4
hindari include_once , lambat, gunakan yang lain, seperti autoloading :)
Timo Huovinen
21
@Timo Berdasarkan tolok ukur yang saya lihat, hanya akan ada perbedaan nyata sekitar 1 detik jika Anda memiliki file dengan 100.000 include_once's. Anda akan lebih baik mengoptimalkan akses DB Anda atau logika lain daripada mengoptimalkan secara prematur file Anda termasuk menggunakan teknik di bawah standar seperti file master include. Fitur pengisian otomatis tidak memiliki kinerja yang berbeda secara signifikan. Masing-masing berfungsi secara berbeda, dan tidak sesuai secara bergantian. Anda dapat menggunakan satu untuk yang lain, tetapi ada kasus sudut di mana mereka tidak berfungsi sama.
AaronLS
3
@Timo Mengutip halaman yang Anda tautkan "menggunakan __autoload () tidak disarankan dan mungkin akan ditinggalkan atau dihapus di masa mendatang."
AaronLS
1
@ AaronLS Tidak dapat mengedit komentar di SO, tautannya juga menghubungkan ke contoh yang lebih baik . Saya menyarankannya setelah membaca komentar pengembang APC dan bagaimana dia membenci include_once (saya merasa tidak enak untuknya). Juga perbedaannya adalah di luar hanya kinerja.
Timo Huovinen
55

Itu terjadi ketika Anda mendeklarasikan suatu kelas lebih dari sekali dalam satu halaman. Anda dapat memperbaikinya dengan membungkus kelas itu dengan pernyataan if (seperti di bawah), atau Anda dapat meletakkannya di file yang terpisah dan digunakan require_once(), sebagai ganti include().

if (!class_exists('TestClass')) {
   // Put class TestClass here
}
Sam
sumber
5
itu class_exists ('TestClass') === false or! class_exist ('TestClass')
Jens A. Koch
2
Dalam @ Jens-AndréKoch komentar "s" tidak ada dalam contoh kedua -> itu class_exists('TestClass') === falseatau!class_exists('TestClass')
furins
Benar. Terima kasih telah menunjukkannya. Tidak dapat diedit lagi .. batas waktu.
Jens A. Koch
Terima kasih untuk logika ini.
Frank
21

Gunakan include_once();- dengan ini, kode Anda akan dimasukkan hanya satu kali.

farhad
sumber
15

Ini akan terjadi jika kita menggunakan salah satu kelas bawaan di perpustakaan php. Saya menggunakan nama kelas sebagai Direktori dan saya mendapatkan kesalahan yang sama. Jika Anda mendapatkan kesalahan terlebih dahulu pastikan bahwa nama kelas yang Anda gunakan bukan salah satu dari kelas bawaan.

Ajeesh
sumber
Jawaban emas di sini untuk saya - Saya bahkan tidak berpikir PHP mungkin memiliki nama kelas yang sama seperti yang saya gunakan!
Jamie M
12

Kesalahan ini juga dapat terjadi jika Anda mendefinisikan __constructmetode lebih dari sekali.

yonicsurny
sumber
2
Ini harus menjadi komentar pada jawaban yang sudah diterima dan sangat tervvotasikan
Yaroslav
8

Terkadang itu terjadi karena beberapa bug di FastCGI PHP.

Coba mulai lagi. Di Ubuntu:

service php-fastcgi restart
luchaninov
sumber
Ok, itu solusi tetapi tidak memperbaiki masalah. Dan dalam kasus saya, masalahnya muncul secara acak satu atau dua kali dalam sebulan. :(
SkaJess
@ SkaJess - Anda dapat menambahkan perintah mulai ulang ke crontab untuk memulai kembali setiap jam. kotor - tetapi akan memastikan bahwa downtime maksimal situs Anda adalah 1 jam.
luchaninov
@bagaimana - ini bukan solusi yang baik bagi saya karena php jatuh selama hari kerja. Saya pikir dengan satu cara saya akan menambahkan perintah restart setiap hari pada malam hari. Dengan cara kedua, saya akan mempertimbangkan untuk meningkatkan IIS dan PHP.
SkaJess
6

Saya memiliki masalah yang sama saat menggunakan autoloadseperti berikut:

<?php

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


__autoload("MyClass1");

$obj = new MyClass1();

?>

dan di kelas lain ada:

namespace testClassNamespace;


class MyClass1
{

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

Solusinya adalah untuk menjaga kompatibilitas namespace, dalam contoh saya namespace testClassNamespace;di kedua file.

Yakub
sumber
3

Hanya menambahkan;

Kesalahan ini juga dapat terjadi jika Anda secara tidak sengaja memasukkan fungsi ke dalam fungsi lain.

bretddog
sumber
3

PHP 5.3 (dan saya pikir versi yang lebih lama juga) tampaknya memiliki masalah dengan nama yang sama dalam kasus yang berbeda. Jadi saya punya masalah ini ketika kelas Login dan antarmuka mengimplementasikan LogIn. Setelah saya mengganti nama Masuk ke Log_In masalah terselesaikan.

Juri Sinitson
sumber
3

Lakukan saja satu hal setiap kali Anda memasukkan atau memerlukan nama file yaitu class.login.php. Anda dapat memasukkannya dengan cara ini:

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

Dengan cara ini tidak pernah terjadi kesalahan.

Haque Asraful
sumber
2

Fungsi ini akan mencetak tumpukan yang memberi tahu Anda dari mana ia dipanggil:

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

Panggil fungsi ini di bagian atas file yang termasuk kelas Anda.

Kadang-kadang hanya akan mencetak sekali, meskipun kelas Anda dimasukkan dua kali atau lebih. Ini karena PHP benar-benar mem-parsing semua kelas tingkat atas dalam file sebelum mengeksekusi kode apa pun dan langsung melemparkan kesalahan fatal. Untuk memperbaiki ini, bungkus deklarasi kelas Anda di if(true) { ... }, yang akan memindahkan kelas Anda ke tingkat yang lebih rendah. Maka Anda harus mendapatkan dua jejak Anda sebelum kesalahan fatal PHP.

Ini akan membantu Anda menemukan di mana kelas Anda dimasukkan dari beberapa kali dalam proyek yang kompleks.

Mpen
sumber
1

Apakah Anda menggunakan Zend Framework? Saya mempunyai masalah yang sama juga.
Saya menyelesaikannya dengan memberi komentar pada baris berikut ini di config/application.ini:

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

Saya harap ini akan membantu Anda.

Praditha
sumber
1

Penyebab lain yang mungkin adalah kontrol sumber dan konflik yang belum terselesaikan. SVN dapat menyebabkan kelas yang sama muncul dua kali dalam file kode yang bertentangan; dua versi alternatifnya ("milikku" dan "milik mereka").

Konrad Morawski
sumber
1

Saya telah mengalami masalah yang sama: versi php yang lebih baru tidak menangani hal yang sama dengan banyak pertikaian dari file yang sama (sebagai perpustakaan), jadi sekarang saya harus mengubah semua menyertakan saya dengan beberapa include_once.

Atau trik ini dapat membantu, jika Anda tidak memiliki terlalu banyak kelas di perpustakaan Anda ...

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

Saya memiliki masalah yang sama "Kesalahan PHP fatal: Tidak dapat mendeklarasikan ulang kelas XYZ.php".

Saya memiliki dua direktori seperti controllerdan modeldan saya mengunggahnya dengan salah XYZ.php di kedua direktori. (Jadi file dengan nama yang sama menyebabkan masalah).

Solusi pertama:

Temukan di seluruh proyek Anda dan pastikan Anda hanya memiliki satu kelas XYZ.php.

Solusi kedua:

Tambahkan namespace di kelas Anda sehingga Anda dapat menggunakan nama kelas yang sama.

Muhammad Shahzad
sumber
0

saya pernah mengalami masalah yang sama. menemukan kasus itu adalah nama kelas. saya mengatasinya dengan mengubah nama. karenanya menyelesaikan masalah.

RT
sumber
0

Ini sebenarnya berarti kelas sudah dideklarasikan di halaman dan Anda mencoba membuatnya kembali.

Teknik sederhana adalah sebagai berikut.

Saya memecahkan masalah dengan yang berikut ini. Semoga ini sedikit membantu Anda.

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