Хтось знає, що може викликати цю проблему?
Фатальна помилка PHP: Неможливо передекларувати клас
if(!class_exists('YourClass')){ include 'YourClass.php'; }
Хтось знає, що може викликати цю проблему?
Фатальна помилка PHP: Неможливо передекларувати клас
if(!class_exists('YourClass')){ include 'YourClass.php'; }
Відповіді:
Це означає, що ви вже створили клас.
Наприклад:
class Foo {}
// some code here
class Foo {}
Той другий Фоо видав би помилку.
У вас однойменний клас, оголошений не один раз. Можливо, через кілька включає. При включенні інших файлів вам потрібно використовувати щось на кшталт
include_once "something.php";
для запобігання декількох включень. Це дуже легко, хоча і не завжди очевидно, оскільки у вас може бути довгий ланцюжок файлів, що включаються один до одного.
Це відбувається, коли ви декларуєте клас кілька разів на сторінці. Ви можете виправити його, або обернувши цей клас випискою if (наприклад, нижче), або можете помістити його в окремий файл і використовувати require_once()
замість цього include()
.
if (!class_exists('TestClass')) {
// Put class TestClass here
}
class_exists('TestClass') === false
or!class_exists('TestClass')
Це станеться, якщо ми будемо використовувати будь-який із вбудованих класів у бібліотеці php. Я використовував ім'я класу як Каталог, і я отримав ту ж помилку. Якщо ви помилитеся спочатку, переконайтесь, що назва класу, який ви використовуєте, не є одним із вбудованих класів.
Ця помилка також може виникнути, якщо __construct
метод визначати кілька разів.
Іноді це трапляється через деякі помилки у FastCGI PHP.
Спробуйте перезапустити його. В 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. Після перейменування входу в Log_In проблему було вирішено.
Просто виконайте одне, коли ви додаєте або вимагаєте назву файлу, а саме class.login.php. Ви можете включити його таким чином:
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>';
}
Викличте цю функцію у верхній частині файлу, що включає ваш клас.
Іноді він надрукується лише один раз, навіть якщо ваш клас включається два чи більше разів. Це тому, що PHP насправді аналізує всі класи найвищого рівня у файлі перед виконанням будь-якого коду та негайно видає фатальну помилку. Щоб виправити це, загорніть свою заяву про класif(true) { ... }
, яка перемістить ваш клас вниз за рівнем. Тоді вам слід отримати дві сліди перед фатальними помилками PHP.
Це допоможе вам знайти місце, де ви класу неодноразово включаєтесь у складний проект.
Інший можливий винуватець - контроль над джерелами та невирішені конфлікти. SVN може призвести до того, що один і той же клас з’являється двічі в конфліктованому файлі коду; дві альтернативні його версії ("моя" та "їхня").
Я зіткнувся з тією самою проблемою: новіша версія php не має однакового множинного додавання одного і того ж файлу (як бібліотека), тому тепер мені доведеться змінити все, що я включаю, на деякий include_once.
Або ці хитрощі можуть допомогти, якщо ви не матимете занадто багато класу у своїй бібліотеці ...
if( class_exists('TestClass') != true )
{
//your definition of TestClass
}
У мене була така ж проблема "PHP Fatal error: Неможливо передекларувати клас XYZ.php".
У мене є два каталоги на кшталт controller
і model
я завантажено помилково XYZ.php в обох каталогах. (Так що файл з однойменною назвою викликає проблему).
Знайдіть у своєму цілому проект і переконайтеся, що у вас є лише один клас XYZ.php.
Додайте у свій клас простір імен, щоб ви могли використовувати те саме ім’я класу.
Це насправді означає, що клас вже оголошено на сторінці, і ви намагаєтесь його відтворити.
Проста техніка полягає в наступному.
Я вирішив питання наступним чином. Сподіваюся, що це вам трохи допоможе.
if(!class_exists("testClassIfExist"))
{
require_once("testClassIfExist.php");
}