2012-10-23 53 views
1

現在我有一個BaseObject對數據庫執行ORM。我依靠私有$ data和magic setter和getter來創建對象作爲私有對象成員(動態地)。在子類中,如果我想更改行爲來設置單個對象成員,則必須覆蓋父設置器並查找關鍵字。我的問題是,如果有更好的方法來做到這一點,我可以只覆蓋單個對象的成員通過__setter寧願去如何覆蓋magic setter和getter之後的參數php

基本對象映射它映射到數據庫和動態創建一堆私人則params的

class Base 
{ 
    private $data = array(); 

    public function __construct(){ 
     //get columns info from db and do set 
    } 
    public function __set($key, $value){ 
     $this->data[$key] = $value;   
    } 

    public function __get($key){ 
     return isset($this->data[$key])? $this->data[$key] : null;  
    } 
} 

和兒童班。眼下覆蓋參數設定我必須這樣做

class Child extends Base 
{ 
    public function __set($name, $value){ 
     if($name == 'dog' && $value == 'chihuahua') 
      $this->dog = 'dog bark wolf wolf'; 
     else if($name == 'cat' && $value == 'sand') 
      $this->cat = 'cat say meow meow'; 
     ... 
    } 
} 

我的問題是有優雅的方式來做到這一點,也許像這樣在子類?

public function __set_dog($value) 
    $this->dog = 'dog bark wolf wolf'; 

public function __set_cat($value) 
    $this->cat = 'cat say meow meow'; 

的目標是做

$animal1 = new Animal(); 
$anmial1->dog = 'pit bull'; 
$anmial1->cat= 'sand'; 

$animal2 = new Animal(); 
$anmial1->dog = 'chihuahua'; 
$anmial1->cat= 'house cat'; 
+0

你能花多一點的文字在你想達到的目的上嗎?我完全不知道你在做什麼。 – Jasper

+0

現在我有一個BaseMode對ORM執行ORM。我依靠私有$ data和magic setter和getter來創建對象作爲私有對象成員(動態地)。在子類中,如果我想更改行爲來設置單個對象成員,則必須覆蓋父設置器並查找關鍵字。我的問題是,如果有更好的方法來做到這一點,我可以重寫單個對象成員,而不是__setter。在此先感謝 – user332951

+0

如果對象成員是私人的,否則沒有別的事情可以做。 –

回答

4

可以動態檢查常規命名的getter/setter方法存在,並調用它而不是返回$數據成員。這裏有一個例子:

class Base { 
    public function __get($key) { 
     if (method_exists($this, $method = 'get' . ucfirst($key))) { 
      return $this->$method($key); 
     } else { 
      return isset($this->data[$key])? $this->data[$key] : null; 
     } 
    } 

    public function __set($key, $value) { 
     if (method_exists($this, $method = 'set' . ucfirst($key))) { 
      $this->$method($key, $value); 
     } else { 
      $this->data[$key] = $value; 
     } 
    } 
} 

class Animal extends Base { 
    protected $data = array('fish' => 'blublublub', 'dog' => 'woof', 'cat' => 'meow'); 

    public function getDog() { 
     return 'dog bark wolf wolf'; 
    } 

    public function getCat() { 
     return 'cat say meow meow'; 
    } 
} 

$animal = new Animal(); 
echo $animal->fish; // "blublublub" 
echo $animal->dog; // "dog bark wolf wolf" 
echo $animal->cat; // "cat say meow meow"