Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

php get_object_vars in abstract class

This is my user 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...
}

This is the abstract class that is inherited by the user class:

<?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()
    {
    }
}

Everytime i call the $obj->getParameters() function i get an empty array (in the 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);
    }

I've already debugged the code and the right object is given to the function!?

Where is my mistake?

FMK

like image 423
FMK Avatar asked Mar 02 '12 14:03

FMK


1 Answers

That's because the properties of the child class are not visible from the method. You have two options:

  • Move the method to the child class.
  • Turn the visibility of the properties from private into protected.
like image 88
Dan Avatar answered Oct 13 '22 11:10

Dan