2012-03-02 51 views
3

这是我的用户等级:PHP get_object_vars

<? 
require_once(dirname(__FILE__).'/DB.class.php'); 
require_once(dirname(__FILE__).'/Model.class.php'); 

class Benutzer extends Model 
{ 
    private $id; 
    private $loginName; 
    private $loginPassword; 
    private $eMail; 
    private $rights; 
    private $mailchange; 
    private $name; 
    private $vorname; 
    private $matrikelnr; 
    private $gruppe; 

    /** 
    * @TODO PhpDoc 
    */ 
    protected function __construct($id = null) 
    { 
     if ($id !== null) 
      $this->load($id); 
    } 

    /** 
    * @TODO PhpDoc 
    */ 
    public static function factory($id = null) 
    { 
     if ($id !== null && is_integer($id)){ 
      return new Benutzer($id); 

     } else { 
      return new Benutzer(); 
     } 
    } 
//getter and setter... 
} 

这是由用户类继承的抽象类:

<?php 

require_once(dirname(__FILE__).'/RowDataGateway.interface.php'); 

abstract class Model implements RowDataGateway 
{ 

    public function getParameters() 
    { 
     return get_object_vars($this); 
    } 

    /** 
    * @TODO PhpDoc 
    */ 
    public function setParameters(array $values, $override = true) 
    { 
     foreach ($values as $key => $val) { 
      if ($override){ 
       if (property_exists(get_class($this), $key)) 
        $this->$key = $val; 
      } 
      else { 
       if (property_exists(get_class($this), $key) && !isset($this->key)) 
        $this->$key = $val; 
      } 

     } 
    } 

    /** 
    * @TODO PhpDoc 
    */ 
    public function load($id, $override = true) 
    { 
     $res = QueryBuilder::selectQuery($this); 
     $result = DB::getInstance()->query($res['query'], array('id' => $id)); 
     $this->setParameters($result, $override); 
     return $this; 
    } 


    /** 
    * @TODO PhpDoc 
    */ 
    public function save() 
    { 
     if (isset($this->id)){ 
      $res = QueryBuilder::updateQuery($this); 
      if (DB::getInstance()->update($res['query'], $res['params'])){ 
       return $this; 
      } 
     } 
     else { 
      $res = QueryBuilder::insertQuery($this); 
      if ($id = DB::getInstance()->insert($res['query'], $res['params'])){ 
       $this->id = $id; 
       return $this; 
      } 
     } 
     return false; 
    } 

    /** 
    * @TODO Implement 
    */ 
    public 
    function delete() 
    { 
    } 
} 

每次我调用$ obj-> getParameters ()函数我得到一个空数组(在foreach中):

 public static function insertQuery(Model $obj) 
    { 
     //INSER INTO classname (field1,field2,field3) VALUES (val1,val2,val3) 
     $vars = null; 
     $query = 'INSERT INTO `'.strtolower(get_class($obj)).'` ('; 
     foreach ($obj->getParameters() as $key => $val) { 
      if ($key !== 'id') 
       $query .= $key.','; 
     } 
     $query = substr($query, 0, strlen($query) - 1); 
     $query .= ') VALUES ('; 
     foreach ($obj->getParameters() as $key => $val) { 
      if ($key !== 'id'){ 
       $query .= ':'.$key.','; 
       $vars[':'.$key] = $val; 
      } 
     } 
     $query = substr($query, 0, strlen($query) - 1); 
     $query .= ')'; 
     return array('query' => $query, 'params' => $vars); 
    } 

我已经调试过代码和正确的o bject被赋予该功能!?

哪里是我的错?

FMK

回答

9

这是因为子类的属性在方法中不可见。您有两种选择:

  • 将该方法移至子类。
  • 打开属性的可视性私人进入保护。
+0

谢谢,这恰好是错误的! – FMK 2012-03-03 11:05:55