3

这是我从未完全确定或从未找到可靠答案的事情。

假设我有一个 User 类,其中有一个 register() 方法,但我不确定哪种方法最适合实现此方法。

在我的 register.php 页面中我应该有

$user->register($_POST['firstName'], $_POST['lastName'], $_POST['username'], etc..);

然后在 register() 方法中不要费心设置对象属性,只需使用方法签名中提供的变量,或者我应该这样做

$user->register();

然后在注册函数中做类似的事情

$this->firstName = $_POST['firstName'];
$this->lastName = $_POST['lastName'];
etc...

提前致谢。

4

3 回答 3

3

如果 register 方法绑定到对象(实例,而不是类),我会让它使用必须提前设置的内部属性。因此,您实例化一个用户,设置属性,然后调用 $user->register()。

$user = new User();
$user->firstName = 'name'; //$user->setFirstName('name') could also work
$user->lastName = 'last name'; // for this to work, the properties have to be public
$user->register();

用户 A 应该只能注册自己,不能注册其他任何东西。

如果你使用带参数的方法,你基本上可以注册任何东西(不仅仅是用户)。

此外,如果注册意味着将参数写入数据库,则仅使用用户对象内部的方法更加健壮。如果您决定更改注册机制(如果您需要来自用户对象的其他信息),则只需修改用户类。

编辑:

现在我已经考虑了更多,我想我会创建另一个类来注册用户,它将获取整个用户对象并添加一个角色或其他任何内容并将其保存到数据库中。这样,用户对象就简单了一点,不需要知道它是如何注册或注销的,如果注册机制发生变化,用户可以保持不变。

编辑2:

从不是真正的 setter 的方法设置对象属性时要小心(就像在 register($fname, $lname, ...) 中那样)。当“某事”无缘无故地改变我的对象时,同样的方法让我很头疼,而且我在代码中的任何地方都找不到设置器或直接调用该属性。

于 2012-07-12T18:00:11.253 回答
1

实施完全取决于您。你可以做任何一种方式。这是一个例子:

class User{

    protected $_firstName = null;

    protected $_lastName = null;


    public function register( array $params = array() ){
        if(!empty($params) ){
           $this->setParams($params);
        }
        // Do more processing here...
    }


    public function setParams($params){
       // Set each of the users attributes.
    }


    public function setFirstName($name = null){
       if($name !== null){
          $this->_firstName = $name;
          return true;
       }
       return false;
    }


    public function getFirstName(){
       return $this->_firstName;
    }


    // Same getter and setter methods for other attributes...

}

通过这种方式,您可以将一组 User 属性传递给 ,$_POST或者您可以通过调用 、 等来单独$user->setFirstName()完成$user->setLastName()...

于 2012-07-12T18:06:27.673 回答
0

考虑到$_POST在全局范围内定义,使用后一种方法会更有意义(不传入参数并从函数中设置它)。但是请注意,这仅适用于$_POST在全局范围内声明的情况(在这种情况下),并且当您从外部 PHP 模块传入类时,您将失去灵活性。

于 2012-07-12T17:57:53.217 回答