将用户输入发送到课程的正确方法是什么?
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方法中转换数据还是将数据传递给已转换的类?什么是最好的方法?为什么呢?
答案 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
可能是最有意义的,并且只能在第二个示例中保证。