PHP数组什么都不返回(OOP新手需要一些帮助)

时间:2010-12-14 18:09:25

标签: php oop

我正在尝试创建一个表单验证器类,它将检查以确保人们在指定字段中键入了特定数量的字符。这是我的页面:

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']);

谁能看到我做错了什么?我会感激一些帮助。感谢。

4 个答案:

答案 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();,使错误成为空数组。你没有尝试将它设置为任何其他值,因此它仍然是一个空数组。