Расширение класса Php, который расширяет другой класс - PullRequest
0 голосов
/ 08 октября 2010

У меня есть требование, когда процесс может быть реализован в 2 разных ситуациях. В одной ситуации дата начала не может быть в прошлом, а в другой -

В настоящее время мы используем объекты-значения, где мы выполняем серию проверочных элементов для каждого поля, отправленного с использованием объектов Zend Validate.

Проверка расширяет базовый класс, например.

Класс ValueObject_test1 расширяет фильтр ()

Фильтр состоит из: -

class filter {
    protected $_filter;
    protected $_filterRules = array();
    protected $_validatorRules = array();
    protected $_data = array();
    protected $_objData = array();
    protected $_options = array(Zend_Filter_Input::ESCAPE_FILTER => 'StripTags');
    protected $_runValidation = true;
    protected function _setFilter()
    protected function _addFilter()
    protected function _addValidator()
    protected function _addData()
    protected function _addObject()
    protected function _addOption()
    public function getData()   
    public function hasErrors()
    public function getMessages()
    public function getValidationState()
    public function __get() 
    public function __isset()
    public function __set()
}

ValueObject_test1 состоит из:

class ValueObject_test1 extends filter {    
    public function __construct($testVar) {
        $this->_setData(testVar);       
        $this->_setFilters();
        $this->_setValidators();        
        if($this->_runValidation) {
            $this->_setFilter();
        }       
    }   
    protected function _setFilters(){
        $this->_addFilter("*", "StringTrim");
    }   
    protected function _setData($testVar) {     
        $this->_addData('testVar', $testVar);       
    }   
    protected function _setValidators() {       
        $this->_addValidator('testVar', array(new Zend_Validate(), 'presence'=>'required', 'messages'=>'Enter something'));
    }   
}

Я пытаюсь добиться расширения ValueObject_test1, чтобы у моей второй ситуации был дополнительный элемент проверки, а также элементы в ValueObject_test1 ()

Я написал следующее для моей второй ситуации: -

<?php

class ValueObject_test2 extends ValueObject_test1 { 
    public function __construct($testVar, $testVar2) {
        $this->_setData($testVar, $testVar2);       
        $this->_setFilters();
        $this->_setValidators();        
        if($this->_runValidation) {
            $this->_setFilter();
        }       
    }   
    protected function _setFilters(){
        $this->_addFilter("*", "StringTrim");
    }   
    protected function _setData($testVar, $testVar2) {  
        $this->_addData('testVar', $testVar);   
        $this->_addData('testVar2', $testVar2);     
    }
    protected function _setValidators() {       
        $this->_addValidator('testVar2', array(new Zend_Validate(), 'presence'=>'required', 'messages'=>'Enter something'));
    }
}

Проблема, с которой я столкнулся, заключается в том, что вывод этой команды, по-видимому, только подтверждает мою вторую проверку ситуации, а на второй - ничего. У меня сложилось впечатление, что, устанавливая обе переменные в _setData (), проверка должна происходить для элементов в ValueObject_test1 и элементов в моем ValueObject_test2?

1 Ответ

2 голосов
/ 08 октября 2010

class ValueObject_test2 extends ValueObject_test1 { 
    public function __construct($testVar, $testVar2) {
        $this->_setData($testVar, $testVar2);       
        parent::__construct($testVar);
    }   
    // _setFilters is identical to the parent implementation
    protected function _setData($testVar, $testVar2) {  
        $this->_addData('testVar2', $testVar2);
        parent::_setData($testVar);
    }
    protected function _setValidators() {       
        $this->_addValidator('testVar2', array(new Zend_Validate(), 'presence'=>'required', 'messages'=>'Enter something'));
        parent::_setValidators();
    }
}

Мой код неправильно вызывает _setData, потому что $ this -> setData (testVar) внутри родительского :: _construct вызовет версию функции $ this -> _ setData (testVar) $.

Если вы хотите переопределить функцию, ваше переопределение, вероятно, захочет также запустить логику родителя.

<?php
class Foo {
    protected function _setFoobar() {       
        // Foo logic
    }
}

class Bar extends Foo {
    protected function _setFoobar() {       
        // custom Bar logic specific to the child class (Bar)
        parent::_setFoobar();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...