虽然var_dump()另有说明,但不是对象?

时间:2009-07-13 15:20:57

标签: php oop object

当我创建控制器时,我将模型( 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降低开销,但现在必须为该部分找到更好的解决方案;)无论如何,现在它可以工作,感谢大家的帮助。

2 个答案:

答案 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)

这将是设置有效调试器的绝佳机会,例如: xdebugnetbeans/php

编辑:缺少“真正的”调试器(这更好)一个(坏)echo / assert调试器必须做

  • 向您的班级添加错误处理程序方法
  • 在构造函数
  • 中设置错误处理程序
  • 在构造函数
  • 中设置error_reporting = E_ALL和display_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"]);
  }