2010-02-22 24 views
3

因此,這裏是一個方法,我在我的控制器:法「_getTable」不存在,並沒有被困在__call()

private $_tables = array(); 

private function _getTable($table) 
{ 
    if (!isset($this->_tables[$table])) { 
     include APPLICATION_PATH . '/modules/' 
     . $this->_request->getModuleName() . '/models/' . $table . '.php'; 
     $this->_tables[$table] = new $table(); 
    } 
    return $this->_tables[$table]; 
} 

我使用像這樣的控制器操作:

public function pageAction() 
{ 
    $request = $this->getRequest(); 
    $pages = $this->_getTable('Pages'); 

    $p = $pages->getSingle($request->getParam('id')); 

    // increment number of views in the database 
    // it only gets incremented when IP is not the same 
    // as last viewer's IP 
    $pages->viewIncrement($p->id); 

    $this->view->headTitle($p->title 
          . ' - Some cool title'); 
    $this->view->p = $p; 
} 

在我的PC上進行測試時,它在localhost上效果很好。它還曾我年長的虛擬主機上,但最近我提出我的ZF應用到一個新的網站託管服務提供商和瀏覽某些網頁時,我得到這個錯誤:

Method "_getTable" does not exist and was not trapped in __call() 

這是所有這一切顯示,沒有別的。有些頁面可以工作,有些顯示這個錯誤,所以我完全失去了。可能是什麼問題呢?

所有必需的PHP擴展都已正確安裝和配置,數據庫連接正常工作(因爲有些頁面可以正常工作)。我真的不知道。如果至少這個錯誤更具描述性。

+0

什麼PHP版本正在您的新主機上使用? – smack0007 2010-02-22 15:20:52

+0

它是PHP版本5.2.6-1。 – 2010-02-22 16:11:32

回答

0

嘗試將私人狀態更改爲限制較少的內容,如公共。

還要確保所有類都實現相同的控制器。

1

您確定不起作用的操作正在擴展實現此方法的自定義控制器嗎?在這個例子中:

class MyController extends Zend_Controller_Action 
{ 
    protected functoin _getTable($table) 
    { 
     // implementation 
    } 
} 


class ProductController extends MyController 
{ 
    public function indexAction() 
    { 
     $this->_getTable('sometable'); // calls MyController::_getTable 
    } 
} 

所有的控制器都在延伸MyController

正如Nazariy所說,您需要將該方法的可見性訪問器設置爲protectedpublicprivate訪問器不會讓你調用這個方法來擴展類。

編輯:既然你說過你在每個控制器中實現了_getTable方法,那麼你在執行時拼錯方法名稱的機會有多大?也許像__getTable(雙下劃線)或_getTalbe(倒字母)?

我知道這是一件基本的事情,但有時你太專注於這個問題而沒有看到共同的解決方案(它發生在我身上)。

即使這不是問題,您應該考慮創建基本控制器並從中進行擴展,以避免此代碼重複。

+0

我沒有擴大自己的班級。我只擴展了Zend_Controller_Action,並在每個控制器中添加了_getTable()方法。因爲我已經sai,這可以在localhost以及我的舊web主機上正常工作。 – 2010-02-22 20:53:12

相關問題