2011-09-20 60 views
2

将用户输入发送到类的正确方法是什么?类,封装和用户输入

Foo类:

<?php 
class Foo 
{ 
    private $_bar; 

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

使用Foo类...

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

还是应该我这样做?

Foo类:

<?php 
class Foo 
{ 
    private $_bar; 

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

使用Foo类...

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

我应该转换数据get方法内或将数据传递给类已经转换?什么是最好的方法?为什么?

+3

适合你的任何东西 – Gordon

+1

对于“适合你的任何作品”+1,我从来没有听说过一个“正确”的方法来做到这一点。无论你选择哪个,都要保持一致。当你有10000行代码进入网站时,它会有很大的帮助! – Clive

回答

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。这意味着在检查结果之前,您甚至可能会在不知情的情况下发生错误。

+0

+1,否则每次调用此方法时都必须重复投射。当然,如果_bar应该总是int。 – Dunhamzzz

+0

@Dunhamzzz我实际上改变了主意,写得太快了。我希望你也喜欢这个方向,否则随时撤回你的+1(他在编辑前投票回答)。 – chelmertz

+0

'PHP在计算时将非空字符串转换为1 - 除非将其转换为布尔值,然后转换为int。对于int转换,它需要最长的前缀,它看起来像一个数字;如果没有这样的事情,结果是0.无论如何,你不应该用验证混乱你的课程 - 分离职责是OOP的基础。应该有一个单独的类负责验证和转换不可信用户输入,并且验证可信内部数据不值得IMO努力。 – Tgr

0

这是更好地使在内部级可以验证,所以没有办法最终存储类(或数据库或...)内无效值。当然,这并不意味着你不能在在外层执行验证以节省一些周期。所以我会选择第二个例子。

0

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

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

1

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

setBar可能会在接收非int时发生异常。