PHP,将参数传递给对象方法或使用实例变量


PHP, passing parameters to object method or using instance variables

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

比方说,我有一个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...

提前谢谢。

如果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的方法设置对象属性时要小心(就像在寄存器中一样($fname,$lname,…))。同样的方法让我头疼,因为"某物"会无缘无故地更改我的对象,而且我在代码中找不到setter或直接调用该属性。

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

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()等单独执行。

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