php get_object_vars在抽象类中

时间:2012-03-02 14:26:26

标签: php oop abstract-class

这是我的用户类:

<?
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-&gt; 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);
    }

我已经调试了代码,并且正确的对象被赋予了函数!?

我的错误在哪里?

FMK

1 个答案:

答案 0 :(得分:11)

这是因为从该方法看不到子类的属性。您有两种选择:

  • 将方法移至子类。
  • 将属性的可见性从私有转为受保护。