方法“_getTable”不存在且未被__call()捕获

时间:2010-02-22 14:02:04

标签: php zend-framework

所以这是我控制器中的方法:

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;
}

在我的电脑上进行测试时,它在localhost上运行良好。它也适用于我的旧网络主机,但最近我已将我的ZF应用程序移动到新的网络托管服务提供商,在查看某些页面时,我收到此错误:

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

这就是显示的一切,没有别的。有些页面有效但有些页面显示此错误,所以我完全迷失了。可能是什么问题?

所有必需的PHP扩展都已正确安装和配置,数据库连接正常(因为某些页面工作正常)。我真的不知道。如果至少错误更具描述性。

2 个答案:

答案 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(倒置字母)?

我知道这是一个基本的事情,但有时候你太专注于这个问题并且没有看到共同的洗脱(它发生在我身上)。

即使不是问题,也应考虑创建基本控制器并从中扩展,以避免此代码重复。

答案 1 :(得分:0)

尝试将私有状态更改为限制较少的内容,例如public。

还要确保所有类都实现相同的控制器。