簡體   English   中英

PHP 致命錯誤:無法重新聲明 class

[英]PHP Fatal error: Cannot redeclare class

有誰知道什么會導致這個問題?

PHP 致命錯誤:無法重新聲明 class

您有多次聲明的同名 class。 也許通過多個包含。 包含其他文件時,您需要使用類似的東西

include_once "something.php";

以防止多重夾雜物。 這種情況很容易發生,盡管並不總是很明顯,因為您可能會有一長串文件被彼此包含。

這意味着您已經創建了 class。

例如:

class Foo {}

// some code here

class Foo {}

第二個 Foo 會拋出錯誤。

當您在一個頁面中多次聲明 class 時,就會發生這種情況。 您可以通過使用 if 語句(如下所示)包裝 class 來修復它,或者您可以將其放入單獨的文件中並使用require_once()而不是include()

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

使用include_once(); - 這樣,您的代碼將只包含一次。

如果我們使用 php 庫中的任何內置類,就會發生這種情況。 我使用 class 名稱作為目錄,我得到了同樣的錯誤。 如果您首先收到錯誤,請確保您使用的 class 名稱不是內置類之一。

如果您多次定義__construct方法,也可能發生此錯誤。

有時這是由於 PHP 的 FastCGI 中的一些錯誤而發生的。

嘗試重新啟動它。 在 Ubuntu 它是:

service php-fastcgi restart

我在使用autoload時遇到了同樣的問題,如下所示:

<?php

function __autoload($class_name)
{
    include $class_name . '.php';
}


__autoload("MyClass1");

$obj = new MyClass1();

?>

在其他 class 中有:

namespace testClassNamespace;


class MyClass1
{

    function  __construct()
    {
        echo "MyClass1 constructor";
    }
}

解決方案是保持命名空間的兼容性,在我的示例namespace testClassNamespace; 在這兩個文件中。

PHP 5.3(我認為也是舊版本)在不同情況下似乎存在同名問題。 所以當我有 class Login 和它實現 LogIn 的接口時,我遇到了這個問題。 在我將 LogIn 重命名為 Log_In 后,問題就解決了。

每當您包含或需要文件名即 class.login.php 時,只需做一件事。 你可以這樣包含它:

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

這樣它永遠不會拋出錯誤。

只需添加;

如果您錯誤地將 function 放入另一個 function 中,也會發生此錯誤。

這個 function 將打印一個堆棧,告訴你它是從哪里調用的:

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>';
}

在包含 class 的文件頂部調用此 function。

有時它只會打印一次,即使您的 class 被包含兩次或更多次。 這是因為 PHP 在執行任何代碼之前實際上會解析文件中的所有頂級類並立即拋出致命錯誤。 要解決此問題,請將您的 class 聲明包裝在if(true) {... }中,這會將您的 class 降低到 scope 的級別。 那么你應該在 PHP 致命錯誤之前得到你的兩條蹤跡。

這應該可以幫助您找到在復雜項目中多次包含 class 的位置。

另一個可能的罪魁禍首是源代碼控制和未解決的沖突。 SVN 可能會導致相同的 class 在沖突的代碼文件中出現兩次; 它的兩個替代版本(“我的”和“他們的”)。

我遇到了同樣的問題:較新的 php 版本對同一個文件(作為庫)的多個包含不同,所以現在我必須通過一些 include_once 更改我的所有包含。

或者這個技巧可能會有所幫助,如果你的圖書館中沒有太多 class ......

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

我遇到了同樣的問題“PHP 致命錯誤:無法重新聲明 class XYZ.php”。

我有兩個目錄,如controllermodel ,我錯誤地上傳了 XYZ.php 在兩個目錄中。(所以同名文件會導致問題)。

第一個解決方案:

在您的整個項目中查找並確保您只有一個 class XYZ.php。

第二種解決方案:

在 class 中添加命名空間,以便可以使用相同的 class 名稱。

你用過 Zend 框架嗎? 我也有同樣的問題。
我通過在config/application.ini中注釋掉以下行來解決它:

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

我希望這能幫到您。

這實際上意味着 class 已經在頁面中聲明並且您正在嘗試重新創建它。

一個簡單的技術如下。

我用以下方法解決了這個問題。 希望這會對您有所幫助。

if(!class_exists("testClassIfExist"))
{
    require_once("testClassIfExist.php");
}

您必須使用 require_once() function。

我遇到了同樣的問題。 發現案例是 class 名稱。 我通過更改名稱來處理它。 從而解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM