遇到錯誤

 

$tabs = WFTabs::getInstance(array(

                    'base_path' => WF_EDITOR_PLUGIN

                ));

MSG:Non-static method WFTabs::getInstance() cannot be called statically

 

 

#############################################################################

 

這又是 PHP 8 的一個經典嚴格變更。

在 PHP 7 以前,如果你用靜態方式(::)去呼叫一個沒有標記為 static 的方法,PHP 只會發出一個 Notice 警告,然後繼續執行。但在 PHP 8 中,這被升級為 Fatal Error (致命錯誤),程式會直接掛掉。

1. 錯誤原因

WFTabs::getInstance() 在類別定義中,可能長這樣:

public function getInstance($config = array()) { ... }

因為少了 static 關鍵字,PHP 8 不允許你直接用 WFTabs:: 來呼叫它。


 

2. 修正方案

你有兩個地方可以改,建議從 方案 A 開始,因為它是最正確的物件導向改法。

方案 A:修改類別定義 (最推薦)

找到 WFTabs 類別定義的檔案(通常在 JCE 的 classes 或 helpers 資料夾下,檔案可能是 tabs.php)。 將 getInstance 的定義加上 static:

// 修改前

public function getInstance($config = array())



// 修改後

public static function getInstance($config = array())

注意: 如果 getInstance 內部使用了 $this(例如 $this->something),那麼這個方法就不能簡單地改為靜態,必須改用方案 B。但通常 getInstance 是單例模式,內部應該是用 static 變數。

方案 B:修改呼叫方式 (如果不能改類別)

如果無法修改 WFTabs 的原始碼,你必須先實例化類別,再呼叫方法(雖然這對 getInstance 這種單例設計來說很奇怪):

$wftabs = new WFTabs();

$tabs = $wftabs->getInstance(array(

    'base_path' => WF_EDITOR_PLUGIN

));

 


 

3. 深入檢查:JCE 的單例模式

JCE 的 getInstance 通常是用來實作 Singleton (單例模式)。在 PHP 8 中,單例模式的標準寫法必須是靜態的。

如果 WFTabs::getInstance 內部長這樣,請務必確保它也是靜態的:

public static function getInstance($config = array())

{

    static $instance;

    if (!$instance) {

        $instance = new WFTabs($config);

    }

    return $instance;

}

 

 

 

 

 

#############################################################################

 

 

 

這種升級後的問題只能改核心檔案

檔案是

joomla3\components\com_jce\editor\libraries\classes\tabs.php

 

需要在 getInstance 加上static

public static function getInstance($config = array())

其實這樣搞起來發現很多BUG都是PHP7對於語法的不嚴謹造成

 語法的不嚴謹 也 讓寫程式的人也沒發現有問題...

可能是好

也可能是壞

 

當然

壞處多一些