doctrine2和codeigniter2,父类与子属性交互的正确方法

时间:2011-01-06 12:30:17

标签: php inheritance properties parent-child visibility

我正在寻找这个已经有一段时间了。 我看到几个类似的问题,但不确定它们是否适用于doctrine2和这个问题。 我想上手CodeIgniter2和Doctrine2,和我有一些问题,我不是在PHP OOP大师。 我想让MainObject包含CRUD的方法和其他几个方法,我希望对象扩展该类并使用parent的方法,但是使用child的属性。由于Doctrine2对对象使用私有属性,因此无法从父类访问这些方法。例如:

   Class MainObject{
    public function validateFields(){
        //go over each field and validate/update if needed
    }
    public function store(){
        // do some validation, some logic, store, etc...
    }
   }
   Class User extends MainObject{
    /**
        * @Column(type="string", length=32, unique=true, nullable=false)
        */
        private $username;

        /**
         * @Column(type="string", length=64, nullable=true)
         */
        private $email;

   }

现在,我想打电话

$user = new User();
//set properties, somehow
$user-__set($something);
//call validation or store or some method from the parent that will interact with child properties
$user->validate();
$user->store();
$user->uploadImage();
$user->formatPropertiesForSomethingSpecial();

我几乎可以通过使用ReflectionClass来做到这一点,但我不确定我是以正确的方式做到这一点? 或者有没有办法让MainObject使用所有这些方法,然后只是将User传递给它,以便它可以做它应该对用户做什么,也许是“更严格”的方法?我不认为它会允许我对用户的私有属性做一些事情,但我想用户可以拥有自己的getter和setter吗?

我在php中使用半oop多年,但这对我来说是新的,所以感谢任何建议,教程,网址,评论,等等。

1 个答案:

答案 0 :(得分:0)

最简单(也是最正确)的方法是使用setter。

Class User extends MainObject{
    private $username;
    private $email;
    public function set_username($username) {
        $this->username = $username;
    }
}

如果您想减少冗长,请在父级中使用通用设置器:

<德尔> Class MainObject{ public function validateFields(){ } public function store(){ } public function set($data) { foreach ($data as $key => $value) { if (property_exists($this, $key)) { $this->$key = $value; } } } } // Example $user = new User(); $data = array('username' => 'foo', 'email' => 'bar@bar.bar'); $user->set($data); $user->validate(); $user->store();

第二种方法至少需要PHP&gt; = 5.1。

我刚刚查看了我的可见性文档。您需要使用受保护的属性而不是私有属性,或者在子类中编写所有的setter。