누구 든지이 문제를 일으킬 수있는 것을 알고 있습니까?
PHP 치명적 오류 : 클래스를 다시 선언 할 수 없습니다
if(!class_exists('YourClass')){ include 'YourClass.php'; }
누구 든지이 문제를 일으킬 수있는 것을 알고 있습니까?
PHP 치명적 오류 : 클래스를 다시 선언 할 수 없습니다
if(!class_exists('YourClass')){ include 'YourClass.php'; }
답변:
이미 클래스를 만들었 음을 의미합니다.
예를 들어 :
class Foo {}
// some code here
class Foo {}
두 번째 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 FastCGI의 일부 버그로 인해 발생합니다.
다시 시작하십시오. 우분투에서 그것은 :
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;
두 파일 모두 에서 네임 스페이스 호환성을 유지하는 것 입니다.
파일 이름, 즉 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은 충돌하는 코드 파일에 동일한 클래스가 두 번 나타날 수 있습니다. 두 가지 대체 버전 ( "광산"및 "그들의").
실제로 클래스가 이미 페이지에 선언되어 있으며 다시 작성하려고 함을 의미합니다.
간단한 기술은 다음과 같습니다.
다음과 같이 문제를 해결했습니다. 이것이 약간 도움이되기를 바랍니다.
if(!class_exists("testClassIfExist"))
{
require_once("testClassIfExist.php");
}