PHP 치명적 오류 : 클래스를 다시 선언 할 수 없습니다


답변:


117

이미 클래스를 만들었 음을 의미합니다.

예를 들어 :

class Foo {}

// some code here

class Foo {}

두 번째 Foo에서 오류가 발생합니다.


75
이 답변은 AaronLS만큼 유용하지 않습니다. 나는 질문자가 그가 이와 같이 명백한 반복을했는지 (아주 복잡한 상황에서도) 질문을하지 않았다고 생각한다. include_once 팁은 PHP의 모호한 기능을 명확하게하는 데 도움이됩니다.
DavidHyogo

2
__construct 메소드를 두 번 이상 정의한 경우에도이 오류가 발생할 수 있습니다.
Jack Trowbridge

4
include_once ( 'FooBar.php')를 사용하여 클래스를 포함하십시오. 함수의 이름은 자명하다.
Marco Matarazzi

2
AaronLS의 답변은 훨씬 높은 등급이며 여기에서 찾을 수 있습니다 .
qris

1
실제로 이것은 질문에 완벽하게 대답하고 영원한 것입니다. AaronLS는 이제 많은 더 나은 방법으로 해결할 수있는 문제를 해결하려고 시도합니다.
TarranJones

317

같은 이름의 클래스가 두 번 이상 선언되었습니다. 여러 번 포함 할 수도 있습니다. 다른 파일을 포함시킬 때 다음과 같은 것을 사용해야합니다

include_once "something.php";

여러 포함을 방지합니다. 서로에 의해 긴 파일 체인이 포함될 수 있기 때문에 항상 명백한 것은 아니지만, 이것이 매우 쉬운 일입니다.


10
이것은 정말 도움이 가득했습니다!
Marci-man

4
include_once 피하십시오 , 느립니다. 자동 로딩 과 같은 다른 것을 사용하십시오 :)
Timo Huovinen

21
@Timo 내가 본 벤치 마크에 따르면, include_once가 100,000 인 파일이있는 경우 약 1 초만 눈에 띄는 차이가 있습니다. 마스터 포함 파일과 같은 하위 표준 기술을 사용하여 파일 포함을 조기에 최적화하는 것보다 DB 액세스 또는 기타 논리를 최적화하는 것이 좋습니다. 자동로드 기능은 크게 다르게 수행되지 않습니다. 각 기능은 다르게 작동하며 호환되지 않습니다. 하나를 다른 용도로 사용할 수 있지만 동일하게 작동하지 않는 경우가 있습니다.
AaronLS

3
@Timo "__autoload ()를 사용하여 링크 된 페이지를 인용하는 것은 권장되지 않으며 향후 더 이상 사용되지 않거나 제거 될 수 있습니다."
AaronLS

1
@AaronLS SO에 대한 주석을 편집 할 수 없으며 링크도 더 나은 예제로 연결됩니다 . APC 개발자의 의견과 그가 include_once를 싫어하는 방법을 읽은 후에 제안했습니다. 또한 차이점은 단순한 성능 그 이상입니다.
Timo Huovinen

55

페이지에서 클래스를 두 번 이상 선언하면 발생합니다. 해당 클래스를 if 문으로 래핑하여 (아래와 같이) 수정하거나 별도의 파일에 넣고 require_once()대신을 사용할 수 있습니다 include().

if (!class_exists('TestClass')) {
   // Put class TestClass here
}

5
그것은 class_exists ( 'TestClass') === false 또는! class_exist ( 'TestClass')
Jens A. Koch

2
@ Jens-AndréKoch 주석에서 두 번째 예에서 "s"가 누락되었습니다-> class_exists('TestClass') === false또는!class_exists('TestClass')
furins

진실. 지적 해 주셔서 감사합니다. 더 이상 편집 할 수 없습니다. 시간 초과.
Jens A. Koch

이 논리에 감사드립니다.
Frank

21

사용 include_once();-이것으로 코드는 한 번만 포함됩니다.


15

PHP 라이브러리에서 내장 클래스를 사용하면 이런 일이 발생합니다. 클래스 이름을 Directory로 사용했는데 같은 오류가 발생했습니다. 먼저 오류가 발생하면 사용하는 클래스 이름이 내장 클래스 중 하나가 아닌지 확인하십시오.


여기에 대한 황금빛 대답-PHP가 내가 사용하는 것과 동일한 클래스 이름을 가지고 있다고 생각조차하지 못했습니다!
Jamie M

12

__construct메소드를 두 번 이상 정의한 경우에도이 오류가 발생할 수 있습니다 .


2
이것은 이미 받아 들여지고 찬성 된 답변에 대한 의견이어야합니다
Yaroslav

8

때로는 PHP FastCGI의 일부 버그로 인해 발생합니다.

다시 시작하십시오. 우분투에서 그것은 :

service php-fastcgi restart

좋아, 그것은 해결책이지만 문제를 해결하지 못합니다. 제 경우에는 문제가 한 달에 한두 번 무작위로 나타납니다. :(
SkaJess

@SkaJess-crontab에 restart 명령을 추가하여 매시간 다시 시작할 수 있습니다. 더티-사이트의 최대 가동 중지 시간은 1 시간입니다.
luchaninov 2012 년

@ how-PHP가 작업 일 동안 떨어지기 때문에 나에게 좋은 해결책이 아닙니다. 나는 밤에 매일 재시작 명령을 추가하는 한 가지 방법으로 생각합니다. 두 번째 방법으로 IIS와 PHP를 업그레이드하는 것을 고려할 것입니다.
SkaJess

6

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;두 파일 모두 에서 네임 스페이스 호환성을 유지하는 것 입니다.


3

그냥 추가;

실수로 다른 함수 안에 함수를 넣은 경우에도이 오류가 발생할 수 있습니다.


3

PHP 5.3 (이전 버전도 마찬가지입니다)은 다른 경우에 같은 이름으로 문제가있는 것 같습니다. 따라서 Login 클래스와 LogIn을 구현하는 인터페이스가있을 때이 문제가 발생했습니다. LogIn을 Log_In으로 이름을 바꾼 후 문제가 해결되었습니다.


3

파일 이름, 즉 class.login.php를 포함하거나 요구할 때마다 한 가지만 수행하십시오. 이 방법으로 포함시킬 수 있습니다 :

include_once class.login.php or 
require_once class.login.php

이런 식으로 오류가 발생하지 않습니다.


2

이 함수는 다음에서 호출 된 위치를 알려주는 스택을 인쇄합니다.

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 치명적인 오류가 발생하기 전에 두 가지 흔적을 얻어야합니다.

이렇게하면 복잡한 프로젝트에서 수업이 여러 번 포함되는 위치를 찾는 데 도움이됩니다.


1

Zend Framework를 사용 했습니까? 나도 같은 문제가 있습니다.
이 줄을 다음과 같이 주석 처리하여 해결했습니다 config/application.ini.

;includePaths.library = APPLICATION_PATH "/../library"

이것이 도움이되기를 바랍니다.


1

또 다른 가능한 원인은 소스 제어와 해결되지 않은 충돌입니다. SVN은 충돌하는 코드 파일에 동일한 클래스가 두 번 나타날 수 있습니다. 두 가지 대체 버전 ( "광산"및 "그들의").


1

같은 문제가 발생했습니다. 새로운 PHP 버전은 동일한 파일 (라이브러리)을 여러 개 포함하여 동일하게 처리하지 않으므로 이제 include_once로 모든 포함을 변경해야합니다.

또는 도서관에 수업이 너무 많지 않으면이 트릭이 도움이 될 수 있습니다 ...

if( class_exists('TestClass') != true )
{
   //your definition of TestClass
}

1

"PHP 치명적 오류 : 클래스 XYZ.php를 다시 선언 할 수 없습니다"와 동일한 문제가있었습니다.

두 디렉토리가 controller있고 두 디렉토리 model에 실수로 XYZ.php로 업로드했습니다. (같은 이름의 파일이 문제를 일으킴).

첫 번째 해결책 :

전체 프로젝트에서 XYZ.php 클래스가 하나만 있는지 확인하십시오.

두 번째 해결책 :

동일한 클래스 이름을 사용할 수 있도록 클래스에 네임 스페이스를 추가하십시오.


0

나는 같은 문제가 발생했습니다. 사건이 클래스 이름이라는 것을 알았습니다. 이름을 바꿔서 처리했습니다. 따라서 문제를 해결합니다.


0

실제로 클래스가 이미 페이지에 선언되어 있으며 다시 작성하려고 함을 의미합니다.

간단한 기술은 다음과 같습니다.

다음과 같이 문제를 해결했습니다. 이것이 약간 도움이되기를 바랍니다.

if(!class_exists("testClassIfExist"))
{
    require_once("testClassIfExist.php");
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.