phpbar.de logo

Mailinglisten-Archive

[php] dynamische Attribute für Klassenkonstruktor

[php] dynamische Attribute für Klassenkonstruktor

Sebastian Mendel lists at sebastianmendel.de
Die Mar 6 10:09:35 CET 2007


Seong-Min Kang schrieb:
> Hi Ronny,
> 
> Ronny Finster schrieb:
>> War nur eine Idee mittels StdClass eine Standardobjekt zu erzeugen und 
>> dieses dann z.B. nach Kunde zu casten.
> 
> witzig, dass du das hier ansprichst. Ich habe unser Framework soeben um
> ORM Funktionen erweitert ;)
> 
> Hier ein paar Ideen, die dir vielleicht weiterhelfen:
> 
> Dabei müssen bei mir alle properties, die Spalten darstellen, protected
> sein. Vielleicht gibt es bessere Unterscheidungsmöglichkeiten.
> 
> abstract class OneMap
> {
>     protected $self;
> 
>     private $_cols = array();
> 
>     public function __construct($data = false)
>     {
>         $R = new ReflectionObject($this);
>         $this->self = new ReflectionClass($R->name);
> 
>         $this->_reflect();

Warum all dieses Reflection?
Nur um die Eigenschaften der Kind-Klasse nocheinmal in dem array _cols zu haben?


>         if ($data instanceof stdClass) {
>             $this->loadProperties($data);
>         }
>     }
> 
>     public function __call($name, $args)
>     {
> 	// musst du noch implementieren
>         $val = PFunctions::decamelize(substr($name, 3));
>         if (!in_array($val, $this->_cols))
>             return false;
>         if (substr($name, 0, 3) == 'set') {
>             $this->$val = $args[0];
>             return true;
>         } elseif (substr($name, 0, 3) == 'get') {
>             return $this->$val;
>         }
>         return false;
>     }
> 
>     ...
> 
>     protected function loadProperties(stdClass $data)
>     {
>         foreach ($this->_cols as $col) {
>             if (!isset($data->$col))
>                 continue;
>             $method = 'set'.ucfirst(PFunctions::camelize($col));
>             if (!call_user_method_array($method, &$this,
> array($data->$col)))

Warnung
The call_user_method_array() function is deprecated as of PHP 4.1.0, use the
call_user_func_array() variety with the array(&$obj, "method_name") syntax
instead.


>                 throw new PException('Could not set property "'.$col.'"');
>         }
>     }
> }
> 
> class Kunde extends OneMap
> {
>     protected $id;
>     protected $first_name;
> 
>     public function __construct($data = false)
>     {
>         parent::__construct($data);
>     }
> }

Warum machst du das?

parent::__construct() wird doch automatisch aufgerufen wenn kein eigener
Konstruktor existiert.


-- 
Sebastian Mendel

www.sebastianmendel.de

php::bar PHP Wiki   -   Listenarchive