类,封装和用户输入

时间:2011-09-20 13:55:31

标签: php set user-input encapsulation typeconverter

将用户输入发送到课程的正确方法是什么?

Foo类:

<?php
class Foo
{
    private $_bar;

    private setBar($bar)
    {
        $this->_bar = $bar;
    }
}
?>

使用foo class ...

<?php
$foo = new Foo();
$foo->setBar((int) $_POST['input']);
?>

或者我应该这样做?

Foo类:

<?php
class Foo
{
    private $_bar;

    private setBar($bar)
    {
        $this->_bar = (int) $bar;
    }
}
?>

使用foo class ...

<?php
$foo = new Foo();
$foo->setBar($_POST['input']);
?>

我应该在get方法中转换数据还是将数据传递给已转换的类?什么是最好的方法?为什么呢?

4 个答案:

答案 0 :(得分:3)

更好的是通过例外验证。如果您添加另一种方法,如:

public function calculateSalary() {
  // uses bar, wants int
  return 100 * $this->_bar;
}

有人使用这样的类:

$foo = new Foo();
$foo->setBar('My Name Here');
echo $foo->calculateSalary(); // will give a result since php is forgiving

为了避免像这样的事故,我写了类似这样的setter:

public function setFoo($number) {
  if(!is_numeric($number)) {
    throw new Exception(__METHOD__." wants a number!");
  }
  $this->_foo = $number;
}

针对#1的参数:用户可能不包含(int),因此在对象中设置了错误类型的数据。

针对#2的争论:(见上面的例子)。如果在计算时使用PHP,则将字符串转换为0。这意味着在检查结果之前,您可能会在得到错误时甚至不知道它。

答案 1 :(得分:1)

bar是一个int。所以setBar应该得到一个int(第一个选项)。如果你想强制它成为一个int,我会期待一个名为setBarFromString的函数(或类似的东西)。

setBar可能会在接收到非int时显示异常。

答案 2 :(得分:0)

最好在内层进行验证,因此无法在类(或数据库或...)中存储无效值。当然,这并不意味着你不能在外层执行验证以节省一些周期。所以我会选择第二个例子。

答案 3 :(得分:0)

定义您的类的API并从那里向后工作。

在这种情况下,强制类存储int可能是最有意义的,并且只能在第二个示例中保证。