当我创建控制器时,我将模型( AccountModel )加载到类变量“Model”并检查用户是否已登录:
function __construct()
{
parent::__construct();
$this->loadModel("AccountModel", "Model");
$account = $this->getUserAccount();
...
}
getUserAccount()中发生致命错误:
致命错误:在第57行的wwwroot / lib / account / account.php中的非对象上调用成员函数getAccount()
这是第57行,我在之前加载的模型上调用了getAccount()
:
$account = $this->Model->getAccount($_SESSION["account"]["user_account_id"]);
因此,看起来$this->Model
不是对象,但是当我在调用var_dump($this->Model)
之前放置getAccount()
时,它会说 object(AccountModel)#26(2)...
我也做了var_dump($this)
,它转储了控制器并发现类变量$Model
存在并且是 AccountModel 的实例。
有人能告诉我到底是怎么回事吗?
顺便说一下,模型是这样分配的(控制器的方法):
function loadModel($model_name, $var_name)
{
// blah blah blah
$obj = new $class_name();
$this->$var_name = $obj;
}
在__construct()中,如果我直接在我的模型上调用 getAccount()(之前我在其中调用 getUserAccount 然后 getAccount )参数,PHP输出错误说:
缺少参数1 AccountModel :: getAccount()
但是当我添加参数时,它表示它不再是对象。
加载模型时,方法loadModel()将模型分配给控制器实例,并将加载模型的每个名称存储到staic属性中。第二次调用控制器时发生错误,因此控制器的第二个实例并未真正获得其模型。用对象属性替换staitc属性(检查模型是否已被调用,避免使用require_once降低开销,但现在必须为该部分找到更好的解决方案;)无论如何,现在它可以工作,感谢大家的帮助。
答案 0 :(得分:2)
您是否禁用了警告和通知?你的loadModel方法应该在new $class_name
上发出警告 - 应该是new $model_name
:
function loadModel($model_name, $var_name)
{
// blah blah blah
$obj = new $model_name();
$this->$var_name = $obj;
}
答案 1 :(得分:1)
这将是设置有效调试器的绝佳机会,例如: xdebug和netbeans/php
编辑:缺少“真正的”调试器(这更好)一个(坏)echo / assert调试器必须做
并且不要忘记在完成调试时删除代码
class YourController extends TheController{
// debug, don't forget to remove/comment out this method
public static function myErrorHandler($errno, $errstr, $errfile, $errline) {
$source = file($errfile);
echo '<fieldset><legend>', htmlspecialchars($errstr. ', '.$errfile.'@'.$errline), "<legend><pre>\n";
for($i=$errline-8; $i<$errline+3; $i++) {
if ( isset($source[$i]) ) {
echo $i+1, ': ', htmlspecialchars($source[$i]);
}
}
echo "\n</pre></fieldset>\n";
flush();
return false;
}
public function __construct()
{
set_error_handler('YourController::myErrorHandler'); // debug, don't forget to remove
error_reporting(E_ALL); ini_set('display_errors', 1); // debug, don't forget to remove
assert_options(ASSERT_ACTIVE, 1); // debug, don't forget to remove
assert_options(ASSERT_WARNING, 1); // debug, don't forget to remove
assert_options(ASSERT_BAIL, 1); // debug, don't forget to remove
assert_options(ASSERT_QUIET_EVAL, 1); // debug, don't forget to remove
parent::__construct();
$this->loadModel("AccountModel", "Model");
assert( is_object($this->Model) ); // debug, don't forget to remove
$account = $this->getUserAccount();
}
public function loadModel($model_name, $var_name)
{
// blah blah blah
$obj = new $model_name();
$this->$var_name = $obj;
}
public function getUserAccount() {
assert( is_object($this->Model) ); // debug, don't forget to remove
assert( is_callable(array($this->Model, 'getAccount')) ); // debug, don't forget to remove
$account = $this->Model->getAccount($_SESSION["account"]["user_account_id"]);
}