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

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...

感谢您的提前帮助。
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,...)中)设置对象属性时,请小心。同样的方法会让我头疼,因为“某些东西”会出于无法解释的原因更改我的对象,而我在代码中找不到setter或直接调用该属性。


当你说实例化用户,设置属性,然后调用 $user->register() 函数时,你是指以何种方式设置属性?在运行 register() 方法之前使用每个属性的 setter 方法吗? - David
你不必使用 setter 方法,可以直接访问属性(如果它是公共的)。然而,使用 setter 方法可以提供一种验证输入的方式,例如,如果姓氏为空,可以抛出异常之类的操作。 我已经在帖子中添加了代码,因为在评论中实现起来有些棘手。 - Ivan Pintar

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...

}

这样,您可以将用户属性数组传递给$_POST,或者通过调用$user->setFirstName()$user->setLastName()等方法单独设置。


0

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


好的,谢谢你的快速回复。我一直在使用最后一种方法,看来我不需要改变任何代码了。 - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接