Php doctrine2和codeigniter2,父类与子属性交互的正确方法
我已经找了很长时间了。 我看到了一些类似的问题,但不确定它们是否适用于教义2和这个问题。 我试图开始使用CodeIgniter2和Doctrine2,但我遇到了一些问题,我不是php中的OOP大师。 我希望MainObject包含CRUD和其他一些方法,我希望对象扩展该类并使用父类的方法,但使用子类的属性。由于Doctrine2对对象使用私有属性,我无法从父类访问这些方法。例如:Php doctrine2和codeigniter2,父类与子属性交互的正确方法,php,inheritance,properties,parent-child,visibility,Php,Inheritance,Properties,Parent Child,Visibility,我已经找了很长时间了。 我看到了一些类似的问题,但不确定它们是否适用于教义2和这个问题。 我试图开始使用CodeIgniter2和Doctrine2,但我遇到了一些问题,我不是php中的OOP大师。 我希望MainObject包含CRUD和其他一些方法,我希望对象扩展该类并使用父类的方法,但使用子类的属性。由于Doctrine2对对象使用私有属性,我无法从父类访问这些方法。例如: Class MainObject{ public function validateFields(){
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中的semi-oop,但这对我来说是一件新鲜事,因此感谢您的建议、教程、url、评论等等。最简单(也是正确)的方法是使用setter
Class User extends MainObject{
private $username;
private $email;
public function set_username($username) {
$this->username = $username;
}
}
如果要使其不那么冗长,请在父级中使用通用setter:
类main对象{
公共函数validateFields(){
}
公共函数存储(){
}
公共函数集($data){
foreach($key=>$value形式的数据){
如果(属性_存在($this$key)){
$this->$key=$value;
}
}
}
}
//范例
$user=新用户();
$data=array('username'=>'foo','email'=>'bar@bar.bar');
$user->set($data);
$user->validate();
$user->store()代码>
第二种方法至少需要PHP>=5.1
我刚刚浏览了一下我的可见性文档。您需要使用受保护的属性而不是私有属性,或者在子类中编写所有setter。谢谢您,先生,这就是我想要使用的,我很高兴您理解我想要做的事情,但是由于私有属性,这不起作用,它会导致致命错误:无法访问第80行e:www\application\models\object.php中的私有属性models\User::$username。现在,如果我像类User extensed main object那样创建简单的Var属性,这就行了{var$username;var$email;现在可能主要的问题是:我应该将属性设置为Public还是它们必须是private,doctrine2才能正常工作,代码才能安全,或者发生什么事情?谢谢!现在Protected按预期工作,非常感谢!我的印象是Protected比private更强大。我会的继续与Protected合作,希望一切都能像我计划的那样顺利:)可见性的层次结构是私有的<受保护的<公共的。祝你好运!