【问题标题】:doctrine2 and codeigniter2, right approach for parent class to interact with child properties教义2和codeigniter2,父类与子属性交互的正确方法
【发布时间】:2011-06-04 15:14:14
【问题描述】:

我正在寻找这个已经有一段时间了。 我看到很少有类似的问题,但不确定它们是否适用于教义2 和这个问题。 我正在尝试开始使用 CodeIgniter2 和 Doctrine2,但我遇到了一些问题,我不是 php 中的 OOP 专家。 我想要包含 CRUD 和其他少数方法的 MainObject,并且我希望对象扩展该类并使用父类的方法,但具有子类的属性。由于 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 传递给它,这样它就可以对用户做它应该做的事情,这可能是“更正确”的方法吗?我认为它不允许我对用户的 Private 属性做一些事情,但我猜 User 可以有自己的 getter 和 setter?

多年来,我一直在 php 中使用 semi-oop,但这对我来说是新事物,因此感谢您提供任何建议、教程、网址、评论等任何内容。

【问题讨论】:

    标签: php inheritance properties parent-child visibility


    【解决方案1】:

    最简单(也是正确)的方法是使用 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 >= 5.1。

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

    【讨论】:

    • 谢谢先生,这是我想要使用的,我很高兴你明白我想要做什么,但是由于私有属性,这不起作用,它会导致致命错误:无法在第 80 行的 e:www\application\models\object.php 中访问私有属性 models\User::$username 现在,如果我创建像此类 User extends MainObject{ var $username; 这样的简单 Var 的属性,这确实有效变量$电子邮件;现在可能的主要问题是:我应该将属性设置为 Public 还是它们必须是私有的,这样才能使教义 2 正常工作,并且代码是安全的,或者任何可能发生的事情?谢谢!
    • 现在受保护的作品按预期工作,非常感谢!我的印象是 protected 比 Private 更“强大”。我将继续与 Protected 合作,并希望一切都能按我的计划正常工作:)
    • 可见性的层次结构是 Private
    猜你喜欢
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    相关资源
    最近更新 更多