Czy ktoś wie, co może powodować ten problem?
Błąd krytyczny PHP: nie można ponownie zadeklarować klasy
if(!class_exists('YourClass')){ include 'YourClass.php'; }
Czy ktoś wie, co może powodować ten problem?
Błąd krytyczny PHP: nie można ponownie zadeklarować klasy
if(!class_exists('YourClass')){ include 'YourClass.php'; }
Odpowiedzi:
Oznacza to, że utworzyłeś już klasę.
Na przykład:
class Foo {}
// some code here
class Foo {}
To drugie Foo spowodowałoby błąd.
Masz klasę o tej samej nazwie zadeklarowaną więcej niż raz. Może przez wiele dołączeń. Dołączając inne pliki, musisz użyć czegoś takiego jak
include_once "something.php";
aby zapobiec wielokrotnym wtrąceniom. Jest to bardzo łatwe, choć nie zawsze jest to oczywiste, ponieważ możesz mieć długi łańcuch plików dołączanych jeden do drugiego.
Dzieje się tak, gdy deklarujesz klasę więcej niż raz na stronie. Możesz to naprawić, opakowując tę klasę instrukcją if (jak poniżej) lub możesz umieścić ją w osobnym pliku i użyć require_once()
zamiast include()
.
if (!class_exists('TestClass')) {
// Put class TestClass here
}
class_exists('TestClass') === false
lub!class_exists('TestClass')
Stanie się tak, jeśli użyjemy którejkolwiek z wbudowanych klas w bibliotece php. Użyłem nazwy klasy jako katalogu i otrzymałem ten sam błąd. Jeśli pojawi się błąd, najpierw upewnij się, że nazwa klasy, której używasz, nie jest jedną z klas wbudowanych.
Ten błąd może również wystąpić, jeśli zdefiniujesz __construct
metodę więcej niż raz.
Czasami dzieje się tak z powodu błędów w FastCGI PHP.
Spróbuj go ponownie uruchomić. W Ubuntu jest to:
service php-fastcgi restart
Miałem ten sam problem podczas używania w autoload
następujący sposób:
<?php
function __autoload($class_name)
{
include $class_name . '.php';
}
__autoload("MyClass1");
$obj = new MyClass1();
?>
aw drugiej klasie:
namespace testClassNamespace;
class MyClass1
{
function __construct()
{
echo "MyClass1 constructor";
}
}
Rozwiązaniem jest zachowanie zgodności przestrzeni nazw, w moim przykładzie namespace testClassNamespace;
w obu plikach.
Wydaje się, że PHP 5.3 (myślę że starsze wersje także) ma problem z tą samą nazwą w różnych przypadkach. Więc miałem ten problem, gdy miał klasę Login i interfejs, który implementuje LogIn. Po zmianie nazwy LogIn na Log_In problem został rozwiązany.
Po prostu zrób jedną rzecz, gdy dołączasz lub wymagasz nazwy pliku, a mianowicie class.login.php. Możesz to załączyć w ten sposób:
include_once class.login.php or
require_once class.login.php
W ten sposób nigdy nie zgłasza błędu.
Ta funkcja wydrukuje stos informujący, skąd został wywołany:
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>';
}
Wywołaj tę funkcję u góry pliku zawierającego twoją klasę.
Czasami wydrukuje się tylko raz, mimo że Twoja klasa jest uwzględniana dwa lub więcej razy. Dzieje się tak, ponieważ PHP faktycznie analizuje wszystkie klasy najwyższego poziomu w pliku przed wykonaniem jakiegokolwiek kodu i natychmiast zgłasza błąd krytyczny. Aby temu zaradzić, zawiń swoją deklarację klasy if(true) { ... }
, co przeniesie twoją klasę o jeden poziom niżej w zakresie. Następnie powinieneś uzyskać dwa ślady przed krytycznymi błędami PHP.
Powinno to pomóc w znalezieniu miejsca, w którym Twoja klasa jest wielokrotnie uwzględniana w złożonym projekcie.
Innym możliwym winowajcą jest kontrola źródła i nierozwiązane konflikty. SVN może spowodować, że ta sama klasa pojawi się dwukrotnie w pliku kodu powodującym konflikt; dwie alternatywne wersje tego („moja” i „ich”).
Napotkałem ten sam problem: nowsza wersja php nie radzi sobie tak samo z wieloma włączeniami tego samego pliku (jako biblioteki), więc teraz muszę zmienić wszystkie moje dołączenia przez niektóre include_once.
Lub te sztuczki mogą pomóc, jeśli nie masz zbyt wielu zajęć w swojej bibliotece ...
if( class_exists('TestClass') != true )
{
//your definition of TestClass
}
Miałem ten sam problem „Błąd krytyczny PHP: nie można ponownie zadeklarować klasy XYZ.php”.
Mam dwa katalogi, takie jak controller
i, model
i przesłałem przez pomyłkę XYZ.php w obu katalogach. (Więc plik o tej samej nazwie powoduje problem).
Znajdź w całym projekcie i upewnij się, że masz tylko jedną klasę XYZ.php.
Dodaj przestrzeń nazw do swojej klasy, aby móc używać tej samej nazwy klasy.
W rzeczywistości oznacza to, że klasa jest już zadeklarowana na stronie i próbujesz ją odtworzyć.
Oto prosta technika.
Rozwiązałem problem w następujący sposób. Mam nadzieję, że to ci trochę pomoże.
if(!class_exists("testClassIfExist"))
{
require_once("testClassIfExist.php");
}