Var_dump () başka söylüyor nesne değil?

2 Cevap php

Ben denetleyicisi oluşturduğunuzda, ben (AccountModel) sınıf değişkeni "Model" için bir model yük ve kullanıcı oturum olup olmadığını kontrol:

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

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

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

Ölümcül hata getUserAccount oluşur ():

Ölümcül hata: satır 57 wwwroot / lib / hesap / account.php olmayan bir nesne üzerinde bir üye işlev getAccount () Çağrı

Bu hat 57 var, ben daha önce yüklenmiş modeli üzerinde getAccount() çağırır:

$account = $this->Model->getAccount($_SESSION["account"]["user_account_id"]);

Yani, $this->Model nesne değil gibi görünüyor, ama ben aramadan önce var_dump($this->Model) koyduğunuzda getAccount(), diyor object(AccountModel)#26 (2) ...

Ben de controller dökülüyor ki, var_dump($this) yaptım ve bu sınıf değişkeni $Model var ve AccountModel örneği buldu.

Herkes cehennem ne oluyor bana söyleyebilir misiniz?

Btw, model, (denetleyicisi yöntemi) gibi atanır:

function loadModel($model_name, $var_name)
{
 // blah blah blah
 $obj = new $class_name();
 $this->$var_name = $obj;
}

Update:

Ben doğrudan çağrı eğer __ Construct () getAccount() benim modeli (daha önce aradım getUserAccount ve getAccount içinde) parametre olmadan, PHP sayin hatası verir:

Missing argument 1 for AccountModel::getAccount()

Ben parametre eklediğinizde Ama yine itiraz olmadığını söylüyor.

Solution:

Denetleyicisi örneğine modelleri, yöntem loadModel () atanan modeli yükleme ve STAIC mülk haline yüklü modelin her adını depolanabilir. Bir hata denetleyici ikinci kez çağrılan olmuştur oluştu, yani kontrolörün ikinci örneği gerçekten modelini alamadım. Kontrol nesne özelliği (değiştirilir staitc mülkiyet modeli zaten Require_once yükünü düşürür kullanarak önler adı olmuştur, ama şimdi çalışıyor, neyse o bölümü ;) için daha iyi bir çözüm bulmak zorunda kalacak, yardım için herkese teşekkür ederim.

2 Cevap

Bu, örneğin bir çalışma hata ayıklayıcı kurmak için mükemmel bir fırsat olacağını xdebug ve netbeans/php

edit: (şekilde daha iyi) bir "gerçek" debugger eksikliği bir (kötü) eko / assert debugger yapmak zorunda

  • sınıf için bir hata işleyicisi yöntemi eklemek
  • yapıcısı içindeki hata işleyicisi ayarlamak
  • yapıcısı içinde error_reporting = E_ALL ve display_errors = On set
  • yapıcısı içinde bazı assert seçeneklerini ayarlayın
  • yapıcısı içinde bir iddiayı ekleyin
  • getUserAccount içinde iki onaylamaları (sizin denetleyicisi) yöntemi ekleyin

Eğer hata ayıklama bittiğinde ve kodunu kaldırmak unutmayın

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"]);
  }

Eğer uyarı ve bildirimleri devre var mı? Sizin loadModel yöntemi new $class_name üzerine bir uyarı atma olmalıdır - olmalı new $model_name:

function loadModel($model_name, $var_name)
{
 // blah blah blah
 $obj = new $model_name();
 $this->$var_name = $obj;
}