2012-07-20 94 views
0

即使是我的系統仍然正常運行我的錯誤日誌突然有了這樣的錯誤overflowding不兼容:Zend的模型聲明抽象

2012-07-20T02:53:25+00:00 WARN (4): [2048] Declaration of User_Model_User::getParent() should be compatible with Core_Model_Item_Abstract::getParent($recurseType = NULL) ([…]/application/modules/User/Model/User.php) [20] 
Error Code: 1b29e1 
Stack trace: 
#0 […]/application/libraries/Engine/Loader.php(103): include_once('/dana/data/www.altandetlige.dk/d...') 
#1 (unknown file)(0): Engine_Loader::autoload('User_Model_User') 
#2 (unknown file)(0): spl_autoload_call('User_Model_User') 
#3 […]/application/libraries/Zend/Db/Table/Rowset/Abstract.php(114): class_exists('User_Model_User') 
#4 […]/application/libraries/Zend/Db/Table/Abstract.php(1340): Zend_Db_Table_Rowset_Abstract->__construct(Array) 
#5 […]/application/libraries/Zend/Db/Table/Abstract.php(1290): Zend_Db_Table_Abstract->fetchAll('((`engine4_users`.`user_id` = 1)...') 
#6 […]/application/modules/User/Api/Core.php(334): Zend_Db_Table_Abstract->find(1) 
#7 […]/application/modules/User/Api/Core.php(167): User_Api_Core->_getUser(1) 
#8 […]/application/modules/User/Bootstrap.php(34): User_Api_Core->getViewer() 
#9 […]/application/modules/Core/Bootstrap.php(783): User_Bootstrap->__construct(Core_Bootstrap) 
#10 […]/application/libraries/Engine/Application/Bootstrap/Abstract.php(256): Core_Bootstrap->_initModules() 
#11 […]/application/libraries/Engine/Application/Bootstrap/Abstract.php(207): Engine_Application_Bootstrap_Abstract->_executeResource('modules') 
#12 […]/application/libraries/Engine/Application/Bootstrap/Abstract.php(150): Engine_Application_Bootstrap_Abstract->_bootstrap() 
#13 […]/application/libraries/Engine/Application.php(149): Engine_Application_Bootstrap_Abstract->bootstrap() 
#14 […]/application/index.php(193): Engine_Application->bootstrap() 
#15 […]/index.php(24): include('/dana/data/www.altandetlige.dk/d...') 
#16 {main} 

使用Core_Model_Item_Abstract會產生完全相同的錯誤所有型號。

奇怪的是,錯誤只顯示在生產服務器上(運行PHP 5.4.3),而不是在開發設置(運行PHP 5.2.11)上顯示。

從錯誤中可以明顯看出Core_Model_Item_Abstract看起來並沒有得到預期的參數,但Core_Model_Item_Abstract沒有發生變化,如果是這種情況,它會在生產和開發中正確顯示。

[編輯]

Core_Model_Item_Abstract父類看起來像這樣。對於我來說,好像代碼已經考慮到$recurseType未設置:

public function getParent($recurseType = null) { 
    if(empty($recurseType)) $recurseType = null; // Parent and owner are same 
    if(!empty($this->_parent_is_owner)) { 
     return $this->getOwner($recurseType); 
    } 
} 

任何人對此有什麼想法?

+0

很可能你正在做一些在PHP 5.2天內可以接受的事情,但現在會引發警告。發佈User_Model_User的代碼,以便我們可以比較您的警告和您的摘要。也許有人可以把它放下。 – RockyFord 2012-07-20 11:49:18

回答

2

變化

class User_Model_User { 
    function getParent() { 
    ... 

class User_Model_User { 
    function getParent($recurseType = NULL) { 
    ... 

,問題就會消失。此更改不會破壞任何內容,但只會安靜記錄日誌。

或者你可以這樣做:

abstract class Core_Model_Item_Abstract 
{ 
    public function getParent(/*$recurseType = NULL*/) 
    { 
     $recurseType = NULL; # forcing to null as no one is passing this parameter 
     ... 
    } 
} 
+0

謝謝你的回答。因爲我有100多個模型,並且getChildren等也受影響,它可以在Core_Model_Item_Abstract中執行這個技巧嗎? – 2012-07-20 04:07:00

+0

查看'Core_Model_Item_Abstract'類,如果在函數中沒有提及'$ recurseType',則可以安全地將它從函數簽名中刪除。如果您知道您的類是唯一將繼承這個類的類,您也可以將其刪除。如果你這樣做,那麼只需在函數的第一行添加'$ recurseType = NULL;'即可。 – 2012-07-20 06:10:53

+0

Core_Model_Item_Abstract中的父類看起來像這樣。對我來說,好像代碼已經考慮到$ recurseType沒有設置: 'public function getParent($ recurseType = null) { if(empty($ recurseType))$ recurseType = null; ($ empty($ this - > _ parent_is_owner)){ return $ this-> getOwner($ recurseType); } .....' – 2012-07-20 09:51:58

0

在你的父類,如果你想避免更改所有的子類,你可以做。

abstract class Core_Model_Item_Abstract 
{ 
    public function getParent() 
    { 

    } 
} 
+0

我不是在這裏跟着你。 Core_Model_Item_Abstract已經有了一個getParent函數? – 2012-07-20 09:55:31

+0

@PeterJensen只需將getParent($ recurseType = null)重命名爲getParent(); – 2012-07-20 10:30:30

0

在PHP5.4,出現這種情況,如果子類覆蓋父類的方法,並具有從父類不同的簽名。

如果您禁用顯示E_STRICT的錯誤,它將得到解決。