【问题标题】:PHP, passing parameters to object method or using instance variablesPHP,将参数传递给对象方法或使用实例变量
【发布时间】:2012-07-12 13:09:10
【问题描述】:

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

假设我有一个 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...

提前致谢。

【问题讨论】:

    标签: php oop methods parameters instance


    【解决方案1】:

    如果 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 方法?
    • 您不必使用setter,您可以直接访问该属性(如果它是公共的)。虽然,setter 可以为您提供一种验证输入的方法,但如果姓氏为空或类似的东西,您可能会抛出异常。我在帖子中添加了代码,因为在评论中这样做很棘手。
    【解决方案2】:

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

    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() 等单独完成...

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 好的,感谢您的快速回复。我一直在使用最后一种方法,所以看起来我不需要更改任何代码。
      猜你喜欢
      • 2010-09-25
      • 2012-02-10
      • 2011-10-09
      • 2018-01-26
      • 2011-02-13
      • 1970-01-01
      • 2016-04-02
      • 2018-09-26
      • 2018-01-23
      相关资源
      最近更新 更多