2012-05-26 115 views
25

目前使用PHP的大平臺稱爲如何解決「非靜態方法XXX:XXX()不應該被靜態地在PHP 5.4

服務器其託管在最近已經升級到PHP 5.4。 。

因爲,我已經收到了很多錯誤信息,如:

[星期六5月26日19時04分41秒2012] [錯誤] PHP嚴格的標準:非靜態方法配置::的getData()不應該被靜態調用,假設$ this來自/xxx/Config.inc.php中不兼容的上下文,第35行

該示例方法被定義爲(注意缺乏「靜態」的關鍵字的):

function &getData() { 
      $configData =& Registry::get('configData', true, null); 

    if ($configData === null) { 
     // Load configuration data only once per request, implicitly 
     // sets config data by ref in the registry. 
     $configData = Config::reloadData(); 
    } 

    return $configData; 
} 

這具有沒有之前造成一個問題,我假定錯誤消息(這會導致應用程序崩潰)可能與最近升級到PHP5.4有關。

是否有PHP設置我可以修改'忽略'缺少靜態關鍵字?

+0

創建一個Config實例並調用它的getData() – Musa

+0

您可以包含'&getData()'內容的示例嗎?具體來說,究竟是什麼被返回以及如何。 –

+0

將&getData()的內容添加到原始問題中 - 但我必須強調,自從升級到5.4後纔會出現此錯誤,所以我確信邏輯正確 – kaese

回答

39

您可以從error_reporting()中刪除E_STRICT,或者您可以簡單地使您的方法成爲靜態的,如果需要靜態調用。據我所知,沒有(嚴格的)方法可以調用靜態方法和非靜態方法。此外,更惱人的是,你不能有兩個同名的方法,一個是靜態的,另一個是非靜態的。

+0

感謝lanzz--這也是我的想法。我不願意讓它們成爲純靜態的,因爲我不確定它們是否也是從非靜態的環境中調用的。我將嘗試從error_reporting()中刪除E_STRICT並回復給您。謝謝。 – kaese

+0

使用getData()實現,不需要在非靜態上下文中調用,因爲它不以任何方式處理實例數據;如果它確實與實例數據一起工作,您將無法在靜態上下文中調用它。 – lanzz

+0

感謝lanzz--但是還有其他方法會拋出相同的警告,這可能會被稱爲非靜態的。您的建議只需關閉error_reporting()中的嚴格錯誤似乎可以解決問題。謝謝! – kaese

-5

我解決了這個一個代碼行,如下: 在index.php文件,在模板的根,這個代碼行後:

定義(「_JEXEC」)或死亡(「限制訪問」) ;

粘貼此行: ini_set('display_errors','Off');

別急,快樂......

發貼者Jenio。

+3

這將隱藏所有錯誤。爲了安全考慮,不要向用戶顯示錯誤是一個好主意,但是它們可能仍然出現在日誌文件中或開發時。其他真實的問題可能會被這種方法忽略。 – amoebe

+0

這不會解決任何問題,並會使其他問題難以發現。 –

+0

在繁忙的網站上,如果您不顯示它們(在HTML文件/客戶端中),但仍然可以啓用它們(在PHP中爲'E_STRICT'),則可能每天都會有100 MB的日誌數據('error_log'文件) )。也發生在我身上。 – Ned64

23

禁用警報消息不是解決問題的方法。儘管PHP核心仍在繼續工作,但它使得一個危險的假設和行動。

永遠不要忽略PHP應該對某個事物做出假設的錯誤!

如果組織爲單身,你可以隨時使用功能的getInstance(),然後使用的getData()

Likse類

$classObj = MyClass::getInstance(); 
$classObj->getData(); 

如果該類不是單身,使用

$classObj = new MyClass(); 
$classObj->getData(); 
4

我不建議你只是在項目上隱藏嚴格錯誤。 這一翻譯,你應該把你的方法,以靜態或嘗試創造的對象的新實例:

$var = new YourClass(); 
$var->method(); 

您也可以使用新的方式做同樣的,因爲PHP 5.4:

(new YourClass)->method(); 

我希望它能幫助你!

相關問題