我正在尝试创建一个表单验证器类,它将检查以确保人们在指定字段中键入了特定数量的字符。这是我的页面:
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
require_once('functions.php');
require_once('formValidator.php');
$validator = new FormValidator();
$validator->setFirst($_POST['first']);
$validator->setLast($_POST['last']);
$validator->setEmail($_POST['email']);
$errors = array();
$validator->checkLength($errors);
echo $errors;
if (!empty($errors)) {
echo '<p>' . $message . '</p>';
}
}
//在这里形成(上面的代码当然是在PHP标签中)
这是我的班级:
class FormValidator {
public $first;
public $last;
public $email;
public $fields_with_lengths;
public function setFirst($first) {
$this->first = $first;
}
public function setLast($last) {
$this->last = $last;
}
public function setEmail($email) {
$this->email = $email;
}
function setLengths() {
$this->fields_with_lengths = array('first' => 2, 'last' => 2, 'email' => 8);
}
function checkLength($fields_with_lengths) {
$length_errors = array();
foreach($fields_with_lengths as $fieldname => $maxlength) {
if (strlen(trim($_POST[$fieldname])) > $maxlength) {
$length_errors[] = $fieldname;
}
}
if (!empty($length_errors)) {
$message = 'There were no errors';
} else {
$message = 'There were errors';
}
return $message;
}
}
$validator = new FormValidator();
$validator->setFirst($_POST['first']);
$validator->setLast($_POST['last']);
$validator->setEmail($_POST['email']);
谁能看到我做错了什么?我会感激一些帮助。感谢。
答案 0 :(得分:2)
你将一个空数组传递给checkLength(),然后迭代它(因此for循环永远不会有任何迭代)。您将从checkLength()返回$ message,但不会将其分配给任何内容。
$errors = array('first' => 8,
'last' => 8,
'email' => 16
);
$message = $validator->checkLength($errors);
答案 1 :(得分:1)
在PHP中,默认情况下,函数的所有值都作为值传递,而不是引用(除非它们是对象)。
首先,如果要将变量用作返回值,则必须将checkLength($var)
定义为:
function checkLength(&$fields_with_lengths) { /* ... */ }
你可以在PHP4中进行类似checkLength(&$errors)
的调用,但是从PHP5开始就不推荐这样做了,并会发出E_STRICT
警告。当然,你仍然可以(但很快就会丢掉这个功能),尽管如上所述,“正确”的方式是作为参考。
更优雅的表现方式,以及在PHP中真正应该做的是返回$fields_with_lengths
。这样:
function checkLength() {
$var = array();
// Your code
return $var;
}
在对函数的调用中,只需说出
$return = $validator->checkLength();
但这并不能解决问题的逻辑。
您正在迭代一个空数组的参数。 您没有迭代$ validator-&gt; fields_with_lengths。 您的代码中的$ fields_with_lengths甚至更多未初始化。
您必须致电$validator->setLengths()
。
一个更好的方法是(你使用PHP5)声明一个构造函数,在PHP5中使用魔术函数__construct()
完成。
但是,由于您只是使用相同的常量值初始化变量,您可以在定义中执行此操作,如下所示:
所以你会有类似的东西:
class FormValidator {
pubilc $first;
pubilc $last;
pubilc $email;
pubilc $fields_with_lengths = array('first' => 2, 'last' => 2, 'email' => 8);
// Rest of code
}
还有...... ¿为什么属性被标记为公共?
OOP理论告诉我们尽可能地缩小可见度范围。因为你有设置者, you don't need to access the attributes directly.
You can in PHP have a magic
__ get($ var)to return a private $attribute if you want the syntactic sugar of
echo $ validator-&gt; first;`。
示例:
function __get($var) {
if(isset($this->{$var})) return $this->{$var}; // this $this->{$var} could even be written as $this->$var but I did it like that for clarity.
}
如果你还想要$validator->first = "John";
的语法糖,你可以对setter做同样的事情,如:
function __set($var, $value) {
if(isset($this->{$var})) {
return $this->{$var} = $value;
} return null; // Or you can throw an exception if you like
}
在PHP中,与其他语言(如Java)相反,您必须显式使用$ this作为函数中对象的当前实例。
所以你的checkLength
被误解了。
您还应该对返回值执行某些操作,而不是仅删除它。
只需稍加修改,您就可以使用
修复代码function checkLength() {
$length_errors = array();
foreach($this->fields_with_lengths as $fieldname => $maxlength) {
if (strlen(trim($_POST[$fieldname])) > $maxlength) {
$length_errors[] = $fieldname;
}
}
if (!empty($length_errors)) {
$message = 'There were no errors';
} else {
$message = 'There were errors';
}
return array($length_errors, $message);
}
您使用的是变量($ length_errors,否则无法访问!因此您计算的数据永远不会有用)。
在对函数的调用中,类似于 $ validator = new FormValidator();
// You could leave the setXXX($_POST[xxx])
$validator->first = $_POST['first'];
$validator->last = $_POST['last'];
$validator->email = ($_POST['email'];
$errors = $validator->checkLength();
echo "<p> {$errors[1]} </p>";
if(!empty($errors[0])) {
// You could do something like foreach($errors[0] as $k => $fieldname) { echo "Error in $fieldname<br />" }
}
答案 2 :(得分:0)
$errors
为空,因为您初始化它但从不更改它。 $message
未设置,因为您从未为其分配任何内容。
答案 3 :(得分:0)
您正在定义$errors = array();
,使错误成为空数组。你没有尝试将它设置为任何其他值,因此它仍然是一个空数组。