Bu soruna neyin neden olabileceğini bilen var mı?
PHP Önemli hata: Sınıf yeniden bildirilemiyor
if(!class_exists('YourClass')){ include 'YourClass.php'; }
Bu soruna neyin neden olabileceğini bilen var mı?
PHP Önemli hata: Sınıf yeniden bildirilemiyor
if(!class_exists('YourClass')){ include 'YourClass.php'; }
Yanıtlar:
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ı.
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.
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
}
class_exists('TestClass') === false
ya da!class_exists('TestClass')
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.
Bu hata, __construct
yöntemi birden çok kez tanımlarsanız da oluşabilir .
Bazen bu PHP'nin FastCGI'sindeki bazı hatalar nedeniyle olur.
Yeniden başlatmayı deneyin. Ubuntu'da:
service php-fastcgi restart
Ben autoload
aş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 .
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ü.
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.
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.
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").
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
}
Aynı sorun vardı "PHP Fatal error: Sınıf XYZ.php yeniden bildirilemiyor".
Ben gibi iki dizine sahip controller
ve model
ben her iki dizine de yanlışlıkla XYZ.php tarafından yüklenen. (Konuyla neden aynı adla dosyanın böylece).
Tüm projenizde bulun ve yalnızca bir sınıf XYZ.php olduğundan emin olun.
Aynı sınıf adını kullanabilmek için sınıfınıza bir ad alanı ekleyin.
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");
}