所以这是我控制器中的方法:
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扩展都已正确安装和配置,数据库连接正常(因为某些页面工作正常)。我真的不知道。如果至少错误更具描述性。
答案 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所说,您需要将方法的可见性访问者设置为protected
或public
。 private
访问器不允许您通过扩展类来调用此方法。
编辑:由于您说过在每个控制器中都实现了_getTable
方法,因此在实现时拼写方法名称的可能性有多大?也许像__getTable
(双下划线)或_getTalbe
(倒置字母)?
我知道这是一个基本的事情,但有时候你太专注于这个问题并且没有看到共同的洗脱(它发生在我身上)。
即使不是问题,也应考虑创建基本控制器并从中扩展,以避免此代码重复。
答案 1 :(得分:0)
尝试将私有状态更改为限制较少的内容,例如public。
还要确保所有类都实现相同的控制器。