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

问题描述:

我正在为此寻找相当长的一段时间。 我看到了几个类似的问题,但不知道他们是否适用于doctrine2和这个问题。 我想要开始使用CodeIgniter2和Doctrine2,并且遇到一些问题,我不是PHP中的OOP guru。 我想有MainObject将包含CRUD和其他几个方法,我希望对象扩展该类和使用父的方法,但与孩子的属性。由于Doctrine2使用私有属性作为对象,我无法从父类访问这些方法。例如:doctrine2和codeigniter2,父类与子属性进行交互的正确方法

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拥有所有这些方法,然后只需将用户传递给它,以便它可以完成它应该对用户做的事情,也许这就是'更为'的方法?我不认为它会允许我使用用户的私有属性,但我猜用户可以拥有自己的getter和setter?

我正在使用php中的半多年,但这是我的新东西,所以谢谢任何意见,教程,网址,批评,任何东西。

最简单(也是正确)的方法是使用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' => '[email protected]'); $user->set($data); $user->validate(); $user->store();

你将需要至少PHP> = 5.1的第二个方法。

我刚刚刷上了我的知名度文档。您需要使用受保护的属性而不是私有的,或者将所有设置者写入子类。

+0

谢谢,先生,这是我想使用的,我很高兴你明白我想要做什么,但这不起作用,因为私人财产,并且它导致 致命错误:无法访问私人属性模型\用户:: $用户名在e:www \ application \ models \ object.php在线80 现在,这个工作,如果我创建属性作为简单变量像这样 类用户扩展MainObject var $ username; var $ email; 现在可能的主要问题是:我应该将属性设置为Public还是它们必须是专用于doctrine2才能正常工作以及代码是否安全或可能发生的任何事情? 谢谢! – Dalibor 2011-01-07 10:47:46