Php 不是对象,尽管var_dump()另有说明?
创建控制器时,我将模型(AccountModel)加载到类变量“model”中,并检查用户是否登录:Php 不是对象,尽管var_dump()另有说明?,php,oop,object,Php,Oop,Object,创建控制器时,我将模型(AccountModel)加载到类变量“model”中,并检查用户是否登录: function __construct() { parent::__construct(); $this->loadModel("AccountModel", "Model"); $account = $this->getUserAccount(); ... } getUserAccount()中发生致命错误: 致命错误:对第57行wwwroo
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
不是object,但是当我在调用getAccount()
之前放置var\u dump($this->Model)
时,它说object(AccountModel)#26(2)
我还做了var\u dump($this)
,它转储了控制器,发现类变量$Model
存在,并且是AccountModel的实例
谁能告诉我到底发生了什么事
顺便说一句,模型分配如下(控制器方法):
更新:
在_construct()中,如果我直接在我的模型上调用getAccount()(之前我调用了getUserAccount,然后在中调用了getAccount),而没有参数,PHP会输出错误消息:
缺少的参数1
AccountModel::getAccount()
但当我添加参数时,它又表示它不是对象
解决方案:
加载模型时,方法loadModel()将模型分配给控制器的实例,并将加载模型的每个名称存储到staic属性中。第二次调用控制器时发生错误,因此控制器的第二个实例并没有真正获取其模型。将staitc属性替换为object属性(检查模型是否已被调用可避免使用require_一度降低开销,但现在必须为该部分找到更好的解决方案;)总之,现在它可以工作了,感谢大家的帮助。您是否禁用了警告和通知?您的loadModel方法应该在
new$class\u name
上抛出警告-应该是new$model\u name
:
function loadModel($model_name, $var_name)
{
// blah blah blah
$obj = new $model_name();
$this->$var_name = $obj;
}
您是否禁用了警告和通知?您的loadModel方法应该在
new$class\u name
上抛出警告-应该是new$model\u name
:
function loadModel($model_name, $var_name)
{
// blah blah blah
$obj = new $model_name();
$this->$var_name = $obj;
}
这将是设置工作调试器的绝佳机会,例如 编辑:在缺少“真正”的调试器(这更好)的情况下,必须使用(坏的)echo/assert调试器
- 向类中添加错误处理程序方法
- 在构造函数中设置错误处理程序
- 在构造函数中设置error\u reporting=E\u ALL并显示\u errors=On
- 在构造函数中设置一些断言选项
- 在构造函数中添加断言
- 在控制器的getUserAccount()方法中添加两个断言
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"]);
}
class YourController扩展了控制器{
//调试时,不要忘记删除/注释此方法
公共静态函数myerrrhandler($errno、$errstr、$errfile、$errline){
$source=文件($errfile);
echo“”,htmlspecialchars($errstr.','.$errfile.@.$errline),“\n”;
对于($i=$errline-8;$iloadModel(“AccountModel”,“Model”);
assert(is_object($this->Model));//调试,不要忘记删除
$account=$this->getUserAccount();
}
公共函数loadModel($model\u name,$var\u name)
{
//废话废话
$obj=新的$model_name();
$this->$var_name=$obj;
}
公共函数getUserAccount(){
assert(is_object($this->Model));//调试,不要忘记删除
assert(可调用(array($this->Model,'getAccount'));//调试,别忘了删除
$account=$this->Model->getAccount($\会话[“帐户”][“用户帐户”\u id]);
}
这将是设置工作调试器的绝佳机会,例如
编辑:在缺少“真正”的调试器(这更好)的情况下,必须使用(坏的)echo/assert调试器
- 向类中添加错误处理程序方法
- 在构造函数中设置错误处理程序
- 在构造函数中设置error\u reporting=E\u ALL并显示\u errors=On
- 在构造函数中设置一些断言选项
- 在构造函数中添加断言
- 在控制器的getUserAccount()方法中添加两个断言
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"]);
}
class YourController扩展了控制器{
//调试时,不要忘记删除/注释此方法
公共静态函数myerrrhandler($errno、$errstr、$errfile、$errline){
$source=文件($errfile);
echo“”,htmlspecialchars($errstr.','.$errfile.@.$errline),“\n”;
对于($i=$errline-8;$iloadModel(“AccountModel”,“Model”);
assert(is_object($this->Model));//调试,不要忘记删除
$account=$this->getUserAccount();
}
公共函数loadModel($model\u name,$var\u name)
{
//废话废话
$obj=新的$model_name();
$this->$var_name=$obj;
}
公共函数getUserAccount(){
assert(is_object($this->Model));//调试,不要忘记删除
assert(可调用(array($this->Model,'getAccount'));//调试,别忘了删除
$account=$this->Model->getAccount($\会话[“帐户”][“用户帐户”\u id]);
}
Ah,我的错误,函数从$model_name(名称转换等)中准备类名,因此$obj=new$class_name()是正确的。好的,在这种情况下,我感觉您正在发布您认为问题所在的代码片段,可能忽略了问题的真正来源:)也许吧,但由于这都是我自定义框架的一部分,所以很难发布整个代码:)但变量仍然是对象,但当我尝试执行it方法时,它会说它不是…:(啊,我的错,函数从$model\u name(名称转换等)准备类名,所以$obj=new$class\u name()好吧,在这种情况下,我感觉你在发布你认为问题所在的代码片段,可能忽略了问题的真正来源:)可能,但sinc