Не объект, хотя var_dump () говорит иначе? - PullRequest
0 голосов
/ 13 июля 2009

Когда я создаю контроллер, я загружаю модель ( AccountModel ) в переменную класса "Model" и проверяю, вошел ли пользователь в систему:

function __construct()
{
    parent::__construct();

    $this->loadModel("AccountModel", "Model");

    $account = $this->getUserAccount();
    ...
}

Неустранимая ошибка в getUserAccount ():

Неустранимая ошибка: вызов функции-члена getAccount () для необъекта в wwwroot / lib / account / account.php в строке 57

Это строка 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 выводит ошибку sayin:

Отсутствует аргумент 1 для AccountModel :: getAccount ()

Но когда я добавляю параметр, он говорит, что он снова не объект.

Решение:

При загрузке моделей метод loadModel () назначает модель экземпляру контроллера и сохраняет каждое имя загруженной модели в свойстве staic. Произошла ошибка, когда контроллер был вызван во второй раз, поэтому второй экземпляр контроллера не получил свою модель. Замененное свойство staitc на свойство объекта (проверка того, что модель уже была вызвана, позволяет избежать использования require_once, что снижает накладные расходы, но теперь нужно будет найти лучшее решение для этой части;) В любом случае, теперь это работает, спасибо всем за помощь.

Ответы [ 2 ]

2 голосов
/ 13 июля 2009

У вас отключены предупреждения и уведомления? Ваш метод 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 голос
/ 13 июля 2009

Это была бы прекрасная возможность настроить рабочий отладчик, например xdebug и netbeans / php

edit: при отсутствии «настоящего» отладчика (что намного лучше) (плохой) отладчик echo / assert должен сделать

  • добавить метод обработки ошибок в ваш класс
  • установить обработчик ошибок в конструкторе
  • set error_reporting = E_ALL и display_errors = On в конструкторе
  • установить некоторые параметры assert в конструкторе
  • добавить утверждение в конструкторе
  • добавьте два утверждения в метод getUserAccount () вашего контроллера

и не забудьте удалить код, когда закончите отладку

<code>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
\ п "; промывать(); вернуть ложь; } публичная функция __construct () { set_error_handler ( 'YourController :: myErrorHandler'); // отладка, не забудьте удалить error_reporting (E_ALL); ini_set ('display_errors', 1); // отладка, не забудьте удалить assert_options (ASSERT_ACTIVE, 1); // отладка, не забудьте удалить assert_options (ASSERT_WARNING, 1); // отладка, не забудьте удалить assert_options (ASSERT_BAIL, 1); // отладка, не забудьте удалить assert_options (ASSERT_QUIET_EVAL, 1); // отладка, не забудьте удалить Родитель :: __ конструкция (); $ this-> loadModel ("AccountModel", "Model"); assert (is_object ($ this-> Model)); // отладка, не забудьте удалить $ account = $ this-> getUserAccount (); } публичная функция loadModel ($ модель_имя, $ var_name) { // бла бла бла $ obj = new $ model_name (); $ this -> $ var_name = $ obj; } public function getUserAccount () { assert (is_object ($ this-> Model)); // отладка, не забудьте удалить assert (is_callable (массив ($ this-> Model, 'getAccount'))); // отладка, не забудьте удалить $ account = $ this-> Model-> getAccount ($ _ SESSION ["account"] ["user_account_id"]); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...