2014-04-06 29 views
0

我可能有一個基本的面向對象的疑問,但我相信這是值得分享數小時後的搜索。從父類(PHP和ZF1)獲取「getters()」到一個數組()PHP

例如:從我的控制器我想要從實體類中檢索數據...但是,此類擴展了可以執行此工作的摘要。 控制器:

//Setting info to object 
$entity->setName('Peter'); 
$entity->setAnge(33); 

//Retriving data in array 
$data = $entity->getData(); 

類實體:

class Entity extends EntityAbstract { 
    private $name; 
    private $age; 

    public function getData() { 
     return parent::getData($this);//I'm passing this object to get its methods (or vars) 
    } 

    public class setName() { ... } 
    public class getName() { ... } 
    public class setAge() { ... } 
    public class getAge() { ... } 
} 

最後Abrastract類(父)。

class EntityAbstract { 

    public function getData($entity) { 
     //I'm not sure how to proceed here. 
     //I've listed all child's methods, but can't list class_vars (private) 
     $methods = get_class_methods($entity); 

     // By listing method, I've tryed to use a regular expression to 
     // identify methods starting with 'get' and then setting an array but 
     // this didn't work... I got a memory exceed error. 
     $data = array(); 
     // foreach() loop 
     $data[ $valueKey ] = $entity->$methodGetOfEach(); 

     return $data; 
    } 
} 

如果也許有一些zend的方法來幫助我,但我相信這是OOP和PHP知識的問題來解決。

感謝您的任何建議。

回答

1

嗨我不是很確定你想達到什麼,但出了一些奇怪的東西,試圖在類中定義一個類作爲getters和setters ...?

無論如何,你爲什麼不這樣做:

class Entity { 

    protected $name; 
    protected $age; 

    public function getName() { 
     return $this->name; 
    } 
    public function setName($name) { 
     $this->name = $name; 
    } 

    public function getAge() { 
     return $this->age; 
    } 
    public function setAge($age) { 
     $this->age = intval($age); 
    } 

    public function toArray() { 
      return = array(
        $this->name, 
        $this->age 
      ); 
    } 
} 

然後,你可以這樣做:

$entity = new Entity(); 

$entity->setName('Peter'); 
$entity->setAge(33); 

//Retriving data in array 
$data = $entity->toArray(); 

更新:

啊,現在我得到了什麼你想要做的。

你可以實現這一目標的方式如下:

class EntityBase { 

    protected $name; 

    public function getName() { 
     return $this->name; 
    } 
    public function setName($name) { 
     $this->name = $name; 
    } 

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

class EntityExtend extends EntityBase { 
    protected $age; 

    public function getAge() { 
     return $this->age; 
    } 
    public function setAge($age) { 
     $this->age = intval($age); 
    } 
} 

$entity = new EntityExtend(); 

$entity->setName('Peter'); 
$entity->setAge(33); 

//Retriving data in array 
$data = $entity->toArray(); 

print_r($data); 

它沒有得到任何與實際的抽象類的類型,雖然。 OOP的魔力。

希望這會有所幫助!

+0

感謝您的幫助......當然,這會奏效。我實際上正在嘗試不必爲每個創建的實體類創建一個toArray(或getData)方法。 根據我的想法,我可以創建新的Entity Classes,擴展EntityAbstract並只設置它的屬性和代人getter和setter。就這樣。謝謝。 – Kzoty

+0

剛剛更新我的答案與你想做的事情。 –

+0

感謝戴夫給你的時間。在這種情況下,我必須將我的實體變量從私有變爲受保護的。沒關係。非常感謝。 – Kzoty