Кто-нибудь знает, что может вызвать эту проблему?
Неустранимая ошибка 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
или!class_exists('TestClass')
Это произойдет, если мы будем использовать любой из встроенных классов в библиотеке php. Я использовал имя класса в качестве каталога и получил ту же ошибку. Если вы получили ошибку, сначала убедитесь, что имя класса, которое вы используете, не является одним из встроенных классов.
Эта ошибка также может возникнуть, если вы определяете __construct
метод более одного раза.
Иногда это происходит из-за некоторых ошибок в PHP FastCGI.
Попробуйте перезапустить его. В 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 и интерфейс, в котором он реализовывал LogIn. После того, как я переименовал 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");
}