2

我已经升级到 PHP 5.4,现在我收到了这个错误消息,我知道为什么我会收到这个消息,但需要找出如何修复它。我知道这是因为当子类扩展父类 validate() 方法时,我在子类中有额外的参数。

严格标准:ValidateName::validate() 的声明应与第 4 行 C:\www\testing\ValidateName.php 中的 Validator::validate($validateThis) 兼容

我在这里看到有人说要使用 func_get_args() 但其他人说不要使用它。

如果出现此错误,我该如何摆脱?

我的家长班

    //Constructor
    public function validate($validateThis) {}

    // Function to add all the error messages to the array
    public function setError($msg) {
        $this->errors[] = $msg;
    }

    // Function to check if the validation passes
    public function isValid() {
        if (count($this->errors) > 0) {
            return false;
        } else {
            return true;
        }
    }

    // Function to get each of the errors
    public function fetch() {
        $error = each($this->errors);
        if ($error) {
            return $error['value'];
        } else {
            reset($this->errors);
            return false;
        }
    }
}
?>

和我的孩子班

    class ValidateName extends Validator {
        public function ValidateName ($name, $field) {
            //  Create an array of errors
            $this->errors = array();
            // Validate the text for that field
            $this->validate($name, $field);
        }  

        public function validate() {

            // If any of the text fields are empty add an error message to the array
            if(empty($name)) {
                $this->setError($field.' field is empty');
            }
            else {
                // Validate the text fields against the regex.  If it fails add error message to array
                if (!preg_match('/^[a-zA-Z- ]+$/', $name)) {
                    $this->setError($field.' contains invalid characters');
                }
                // if the length of the field is less than 2, add error message to array
                if (strlen($name) < 2) {
                    $this->setError($field.' is too short'); 
                }
                // if the length of the field greater than 30, add error message to array
                if (strlen($name) > 50) {
                    $this->setError($field.' is too long');
                }
            }    
        }    
    }
?>
4

2 回答 2

1
  • 评论是错误的// constructor,因为类名是Validator,请改进你的问题:-)
  • $ignored您可以通过向子方法添加参数来“修复”它validate(),但这可能是一个设计问题:您应该决定要验证的对象是作为参数传递给validate方法还是在构造过程中(这个选择稍微改变了性质你们班的)
  • 根据LSP,无论哪种方式,子类都应该与父类一致
于 2013-08-22T09:43:35.547 回答
0

因为方法构造函数PHP 5.3.3

__construct

所以你必须使用:

class ValidateName extends Validator {
    public function __construct($name, $field) { //It must not be ValidateName
        //  Create an array of errors
        $this->errors = array();
        // Validate the text for that field
        $this->validate($name, $field);
    } 
}

派生类的构造函数可能与父类的构造函数不同,但是如果你写public function ClassName(),它被视为一个通常的方法,并且当你派生时,你应该实现它必须接受的参数。

于 2013-08-22T09:29:03.503 回答