18 ответов:
Это означает, что вы уже создали класс.
например:
class Foo {} // some code here class Foo {}что второй Foo бросит ошибку.
у вас есть класс с тем же именем, объявленным более одного раза. Может быть, через несколько включает в себя. При включении других файлов вам нужно использовать что-то вроде
include_once "something.php";для предотвращения многократных включений. Это очень легко для этого происходит, хотя и не всегда очевидно, так как вы можете иметь длинную цепочку файлов, включенных друг в друга.
что происходит, когда вы объявляете класс более одного раза на странице. Вы можете исправить это, либо обернув этот класс с помощью оператора if (как показано ниже), либо вы можете поместить его в отдельный файл и использовать
require_once(), вместоinclude().if (!class_exists('TestClass')) { // Put class TestClass here }
Это произойдет, если мы используем любой из встроенных классов в библиотеке php. Я использовал имя класса в качестве каталога и я получил ту же ошибку. Если вы получаете ошибку, сначала убедитесь, что имя класса, которое вы используете, не является одним из встроенных классов.
иногда это происходит из-за некоторых ошибок в 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 (я думаю, что более старые версии тоже), похоже, имеют проблемы с одним и тем же именем в разных случаях. Поэтому у меня была эта проблема, когда у A был логин класса и интерфейс, который он реализует LogIn. После того, как я переименовал LogIn в Log_In проблема была решена.
эта функция выведет стек, сообщающий вам, откуда он был вызван:
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.Это должно помочь вам найти, где вы класс включается с нескольких раз в сложном проекте.
просто сделайте одну вещь, когда вы включаете или требуете имя файла, а именно класс.авторизоваться.РНР. Вы можете включить его таким образом:
include_once class.login.php or require_once class.login.phpтаким образом, он никогда не бросает ошибку.
вы использовали Zend Framework? У меня тоже такая проблема.
Я решил это, комментируя эту следующую строку вconfig/application.ini:;includePaths.library = APPLICATION_PATH "/../library"Я надеюсь, что это поможет вам.
еще одним возможным виновником является система управления версиями и неразрешенные конфликты. SVN может привести к тому, что один и тот же класс дважды появится в конфликтном файле кода; две альтернативные версии его ("мой" и "их").
я столкнулся с той же проблемой: более новая версия php не имеет дело с несколькими incluse одного и того же файла (как библиотека), поэтому теперь мне нужно изменить все мои include на некоторые include_once.
или эти трюки могут помочь, если у вас слишком много классов в вашей библиотеке...
if( class_exists('TestClass') != true ) { //your definition of TestClass }
у меня была та же проблема "PHP Fatal error: не удается переопределить класс XYZ.РНР."
у меня есть два каталога, как
controllerиmodelи я загрузил по ошибке XYZ.PHP в обоих каталогах.(так что файл с тем же именем вызвать проблему).первый вариант:
найти во всем проекте и убедитесь, что у вас есть только один класс XYZ.РНР.
второй вариант:
добавьте пространство имен в свой класс, чтобы вы могли использовать тот же класс имя.
Я столкнулся с той же проблемой. выяснил, что дело было имя класса. я справился с этим, изменив имя. отсюда и решение проблемы.
Это фактически означает, что класс уже объявлен на странице и вы пытаетесь воссоздать его.
простой метод заключается в следующем.
Я решил проблему со следующим. Надеюсь, это поможет вам немного.
if(!class_exists("testClassIfExist")) { require_once("testClassIfExist.php"); }
Comments