doctrine2 и codeigniter2, правильный подход для родительского класса для взаимодействия с дочерними свойствами - PullRequest
0 голосов
/ 06 января 2011

Я уже давно ищу это.Я видел несколько похожих вопросов, но не уверен, применимы ли они к доктрине2 и этой проблеме.Я пытаюсь начать работу с CodeIgniter2 и Doctrine2, и у меня возникают некоторые проблемы, я не гуру ООП в php.Я хотел бы иметь MainObject, который будет содержать методы для CRUD и несколько других, и я хочу, чтобы объекты расширяли этот класс и использовали методы родителя, но со свойствами дочернего элемента.Поскольку Doctrine2 использует Private Properties для объектов, я не могу получить доступ к этим методам из родительского класса.Например:

   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, чтобы он мог делать то же, что и пользователь, возможно, это «правильный» подход?Я не думаю, что это позволит мне что-то делать с частными свойствами от пользователя, но я предполагаю, что у пользователя могут быть свои собственные методы получения и установки?

Я работаю с semi-oop в php в течение многих лет, но это что-то новое для меня, так что спасибо за любой совет, учебник, URL, критику, что угодно.

1 Ответ

0 голосов
/ 06 января 2011

Самый простой (и правильный) способ - использовать сеттер.

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.

Я только что проверил свою документацию по видимости. Вам нужно будет использовать защищенное свойство вместо private или написать все свои сеттеры в дочернем классе.

...