PHP Önemli hata: Sınıf yeniden bildirilemiyor


Yanıtlar:


117

Bu, zaten bir sınıf oluşturduğunuz anlamına gelir.

Örneğin:

class Foo {}

// some code here

class Foo {}

O ikinci Foo hatayı atacaktı.


75
Bu cevap AaronLS kadar yararlı değil. Sorgulayıcının böyle açık bir tekrarlama yazıp yazmadığı sorusunu sorduğunu sanmıyorum (oldukça karmaşık bir durumda bile). İnclude_once ipucu PHP'nin belirsiz bir özelliğini netleştirmeye yardımcı olur.
DavidHyogo

2
Bu hata, __construct yöntemini birden çok kez tanımlarsanız da oluşabilir.
Jack Trowbridge

4
Sınıfınızı dahil etmek için include_once ('FooBar.php') kullanın. İşlevin adı açıklayıcıdır.
Marco Matarazzi

2
AaronLS'nin cevabı çok daha yüksek puan aldı ve bunu burada bulabilirsiniz .
qris

1
Aslında bu soruyu mükemmel bir şekilde cevaplıyor ve zamansız, AaronLS bir varsayım yapıyor ve daha sonra artık çok daha iyi yollarla çözülebilecek sorunu çözmeye çalışıyor.
TarranJones

317

Birden fazla kez aynı adı taşıyan bir sınıfınız var. Belki birden fazla içerir. Diğer dosyaları eklerken aşağıdaki gibi bir şey kullanmanız gerekir

include_once "something.php";

birden fazla kapanmayı önlemek için. Her zaman açık olmasa da, bunun olması çok kolaydır, çünkü birbiriniz tarafından uzun bir dosya zincirine sahip olabilirsiniz.


10
Bu gerçekten çok yardımcı oldu!
Marci-man


21
@Timo Baktığım kıyaslamalara dayanarak, 100.000 include_once's içeren bir dosyanız varsa, yaklaşık 1 saniyelik fark edilir bir fark olacaktır. DB erişiminizi veya diğer mantığınızı optimize etmek, ana içerme dosyaları gibi standart dışı teknikler kullanarak dosyanızı erken optimize etmekten daha iyi olur. Otomatik yükleme özelliği önemli ölçüde farklı performans göstermiyor. Her biri farklı şekilde çalışır ve birbirinin yerine uygun değildir. Birini diğeri için kullanabilirsiniz, ancak aynı işlev görmedikleri köşe kutuları vardır.
18:19

3
@Timo Bağlantı verdiğiniz sayfayı alıntılamak için "__autoload () kullanılması önerilmez ve gelecekte kullanımdan kaldırılabilir ya da kaldırılabilir."
18:20

1
@AaronLS SO'daki yorumları düzenleyemezseniz, bağlantı aynı zamanda daha iyi örneğe de bağlanır . APC'nin geliştiricilerinin yorumlarını ve nasıl include_once'dan nefret ettiğini okuduktan sonra önerdim (onun için kendimi kötü hissettim). Ayrıca fark performansın ötesinde.
Timo Huovinen

55

Bu, bir sayfada bir kereden fazla sınıf bildirdiğinizde olur. Bu sınıfı ya bir if ifadesiyle (aşağıdaki gibi) sararak düzeltebilir ya da ayrı bir dosyaya koyabilir ve require_once()yerine kullanabilirsiniz include().

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

5
class_exists ('TestClass') === yanlış veya! class_exist ('TestClass')
Jens A. Koch

2
@ Jens-AndréKoch yorumda ikinci örnekte bir "s" eksik -> class_exists('TestClass') === falseya da!class_exists('TestClass')
furins

Doğru. Bunu işaret ettiğiniz için teşekkürler. Artık düzenlenebilir değil .. zaman aşımı.
Jens

Bu mantık için teşekkürler.
Frank

21

Kullanın include_once();- bununla kodlarınız yalnızca bir kez dahil edilecektir.


15

Bu php kütüphanesinde yerleşik sınıflardan herhangi birini kullanırsanız olur. Sınıf adını Dizin olarak kullandım ve aynı hatayı aldım. Hata alırsanız, kullandığınız sınıf adının yerleşik sınıflardan biri olmadığından emin olun.


Burada benim için altın cevap - PHP'nin kullandığımla aynı sınıf adına sahip olabileceğini bile düşünmedim!
Jamie M

12

Bu hata, __constructyöntemi birden çok kez tanımlarsanız da oluşabilir .


2
Bu, zaten kabul edilmiş ve son derece onaylanmış cevap hakkında bir yorum olmalı
Yaroslav

8

Bazen bu PHP'nin FastCGI'sindeki bazı hatalar nedeniyle olur.

Yeniden başlatmayı deneyin. Ubuntu'da:

service php-fastcgi restart

Tamam, bu bir çözüm ama sorunu düzeltmiyor Ve benim durumumda, sorun ayda bir veya iki kez rastgele görünüyor. :(
SkaJess

@SkaJess - saatlik olarak yeniden başlatmak için crontab'a restart komutu ekleyebilirsiniz. kirli - ancak sitenizin maksimum kesinti süresinin 1 saat olmasını sağlar.
luchaninov

@how - benim için iyi bir çözüm değil çünkü php iş günü boyunca düşüyor. Bir şekilde gece boyunca günlük yeniden başlatma komutunu ekleyeceğimi düşünüyorum. İkinci şekilde, IIS ve PHP'yi yükseltmeyi düşüneceğim.
SkaJess

6

Ben autoloadaşağıdaki gibi kullanırken aynı sorunu vardı :

<?php

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


__autoload("MyClass1");

$obj = new MyClass1();

?>

ve diğer sınıfta şunlar vardı:

namespace testClassNamespace;


class MyClass1
{

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

Çözüm, örneğimde namespace testClassNamespace;her iki dosyada da ad alanı uyumluluğunu korumaktır .


3

Sadece ekleyerek;

Bu hata, yanlışlıkla başka bir işlevin içine bir işlev koyarsanız da oluşabilir.


3

PHP 5.3 (eski sürümleri de düşünüyorum) farklı durumlarda aynı ada sahip sorun var gibi görünüyor. Bu yüzden bir giriş Login ve LogIn uygulayan arayüzü vardı bu sorun vardı. Ben Log_In oturum açma yeniden adlandırdıktan sonra sorun çözüldü.


3

Class.login.php dosya adını eklediğinizde veya gerektiğinde bir şey yapmanız yeterlidir. Bu şekilde ekleyebilirsiniz:

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

Bu şekilde asla hata yapmaz.


2

Bu işlev size nereden çağrıldığını söyleyen bir yığın yazdırır:

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

Sınıfınızın bulunduğu dosyanın üst kısmındaki bu işlevi çağırın.

Sınıfınız iki veya daha fazla kez dahil edilmiş olsa bile bazen yalnızca bir kez yazdırılır. Bunun nedeni, PHP'nin herhangi bir kodu çalıştırmadan önce bir dosyadaki tüm üst düzey sınıfları ayrıştırması ve ölümcül hatayı hemen atmasıdır. Bunu düzeltmek için sınıf bildiriminiziif(true) { ... } , bu da sınıfınızı kapsamın bir seviyesine indirir. Daha sonra PHP ölümcül hatalarından önce iki izinizi almalısınız.

Bu, karmaşık bir projede sınıfınızın birden çok kez dahil edildiğini bulmanıza yardımcı olacaktır.


1

Zend Framework'ü kullandınız mı? Benim de aynı problemim var.
Ben şu satırda yorum yaparak çözdü config/application.ini:

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

Umarım bu sana yardımcı olmuştur.


1

Bir başka olası suçlu, kaynak kontrolü ve çözülmemiş çatışmalardır. SVN, aynı sınıfın çakışan kod dosyasında iki kez görünmesine neden olabilir; bunun iki alternatif versiyonu ("benim" ve "onların").


1

Aynı sorunla karşılaştım: yeni php sürümü aynı dosyanın (kitaplık olarak) birden çok incluse ile aynı uğraşmaz, bu yüzden şimdi tüm include_once tarafından tüm dahil değiştirmek zorunda.

Ya da bu hileler yardımcı olabilir, eğer kütüphanenizde çok fazla ders yoksa ...

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

1

Aynı sorun vardı "PHP Fatal error: Sınıf XYZ.php yeniden bildirilemiyor".

Ben gibi iki dizine sahip controllerve modelben her iki dizine de yanlışlıkla XYZ.php tarafından yüklenen. (Konuyla neden aynı adla dosyanın böylece).

İlk çözüm:

Tüm projenizde bulun ve yalnızca bir sınıf XYZ.php olduğundan emin olun.

İkinci çözüm:

Aynı sınıf adını kullanabilmek için sınıfınıza bir ad alanı ekleyin.


0

aynı sorunla karşılaştım. davanın sınıf adı olduğunu öğrendim. adı değiştirerek onunla uğraştım. dolayısıyla sorunu çözer.


0

Bu aslında sınıfın sayfada zaten bildirildiği ve yeniden oluşturmaya çalıştığınız anlamına gelir.

Basit bir teknik aşağıdaki gibidir.

Sorunu aşağıdakilerle çözdüm. Umarım bu sana biraz yardımcı olur.

if(!class_exists("testClassIfExist"))
{
    require_once("testClassIfExist.php");
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.