【问题标题】:How do I pass specific optional arguments?如何传递特定的可选参数?
【发布时间】:2020-03-11 00:03:47
【问题描述】:

我有两个案例。

  • 案例1:通过nameage
  • 案例2:通过namegender

我该怎么做?


class User {

    function __construct($name=NULL, $gender=NULL, $age=NULL) {
        ...
    }

}

// How do I pass specific arguments here?
$case_1 = new User("Bob", 34);
$case_2 = new User("James", "m");

【问题讨论】:

  • new User("Bob", null, 34);
  • @miken32 我知道我可以将null传递给我不想要任何东西的参数。但是,如果我不知道对象的内部结构是如何制作的,我怎么知道@ 987654328@是默认参数吗?在python中你可以做User(age=34)
  • @miken32 哦,我明白了,谢谢!
  • 实际上,我收回了这一点,我在想别的东西。 :) 空值将被传递给函数。发布的答案是您最好的选择。

标签: php class constructor optional-arguments


【解决方案1】:

您可以在 PHP 中使用可选参数,但您不能使用其中一个/或一个参数,因为这需要 PHP 不支持的函数重载。鉴于您的示例,您必须按如下方式调用构造函数:

// How do I pass specific arguments here?
$case_1 = new User("Bob", null, 34);
$case_2 = new User("James", "m");

如果你想消除可选但必须为空的参数,你需要变得聪明。

选项一:使用工厂。这将需要一个公共参数构造函数以及每个唯一参数的 mutator 方法。

class UserFactory {
   public static function createWithGender($name, $gender)
   {
       $user = new User($name);
       $user->setGender($gender);

       return $user;
   }

   public static function createWithAge($name, $age)
   {
       $user = new User($name);
       $user->setAge($age);

       return $user;
   }
}

$case_1 = UserFactory::createWithAge("Bob", 34);
$case_2 = UserFactory::createWithGender("James", "m");

工厂不需要是一个单独的类,如果需要,您可以将静态初始化器添加到 User 类中。

class User {
   function __construct($name = null)
   {
        ...
   }

   public static function createWithGender($name, $gender)
   {
       $user = new static($name);
       $user->setGender($gender);

       return $user;
   }

   public static function createWithAge($name, $age)
   {
       $user = new static($name);
       $user->setAge($age);

       return $user;
   }
}

$case_1 = User::createWithAge("Bob", 34);
$case_2 = User::createWithGender("James", "m");

选项二:做一些参数检测。这仅在参数都是唯一类型时才有效。

class User {
    public function __construct($name, $second = null) {
        if (is_int($second)) {
            $this->age = $second;
        } else {
            $this->gender = $second;
        }
    }
}

$case_1 = new User("Bob", 34);
$case_2 = new User("James", "m");

【讨论】:

  • 那些静态工厂函数可能应该返回用户:) 另外new self(...)(或new static(...),如果你想实例化潜在的子类)会更优雅一点,但我在吹毛求疵。
  • 谢谢,我在编写样本时有点仓促。更新了忘记返回和 new static(...),用于通过静态初始化器对 User 对象进行后期静态绑定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 2021-10-22
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多