Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP,将参数传递给对象方法或使用实例变量_Php_Oop_Methods_Parameters_Instance - Fatal编程技术网

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

PHP,将参数传递给对象方法或使用实例变量,php,oop,methods,parameters,instance,Php,Oop,Methods,Parameters,Instance,这是我从未完全确定或从未找到可靠答案的事情 假设我有一个用户类,其中有一个register()方法,我不确定哪种方法最好实现这个方法 在我的register.php页面中,我应该 $user->register($_POST['firstName'], $_POST['lastName'], $_POST['username'], etc..); 然后在register()方法中,不必设置objects属性,只需使用方法签名中提供的变量,或者我应该这样做吗 $user->regis

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

假设我有一个用户类,其中有一个register()方法,我不确定哪种方法最好实现这个方法

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

$user->register($_POST['firstName'], $_POST['lastName'], $_POST['username'], etc..);
然后在register()方法中,不必设置objects属性,只需使用方法签名中提供的变量,或者我应该这样做吗

$user->register();
然后在寄存器函数中执行如下操作

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

提前感谢。

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

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

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

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

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

编辑:

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

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

}

通过这种方式,您可以将一组用户属性传递给
$\u POST
,也可以通过调用
$User->setFirstName()
$User->setLastName()
,等单独执行。

好的,谢谢您的快速回复。我一直在使用上一种方法,所以看起来我不需要更改任何代码。当您说实例化用户时,设置属性,然后调用$user->register()函数,您的意思是以什么方式设置属性?在运行register()方法之前,对每个属性使用setter方法?您不必使用setter,您可以直接访问该属性(如果它是公共的)。尽管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...

}