遇到錯誤
$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對於語法的不嚴謹造成
語法的不嚴謹 也 讓寫程式的人也沒發現有問題...

可能是好
也可能是壞
當然
壞處多一些![]()

留言板
歡迎留下建議與分享!希望一起交流!感恩!