Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php doctrine2和codeigniter2,父类与子属性交互的正确方法_Php_Inheritance_Properties_Parent Child_Visibility - Fatal编程技术网

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

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(){

我已经找了很长时间了。 我看到了一些类似的问题,但不确定它们是否适用于教义2和这个问题。 我试图开始使用CodeIgniter2和Doctrine2,但我遇到了一些问题,我不是php中的OOP大师。 我希望MainObject包含CRUD和其他一些方法,我希望对象扩展该类并使用父类的方法,但使用子类的属性。由于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使用所有这些方法,然后将用户传递给它,这样它就可以对用户执行它应该执行的操作,这可能是“更正确”的方法?我认为它不允许我对用户的私有属性进行处理,但我想用户可以有自己的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合作,希望一切都能像我计划的那样顺利:)可见性的层次结构是私有的<受保护的<公共的。祝你好运!