我正在寻找这个已经有一段时间了。 我看到几个类似的问题,但不确定它们是否适用于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多年,但这对我来说是新的,所以感谢任何建议,教程,网址,评论,等等。
答案 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。