Php 不是对象,尽管var_dump()另有说明?

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

创建控制器时,我将模型(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
不是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