Php 如何传递特定的可选参数?
我有两个箱子Php 如何传递特定的可选参数?,php,class,constructor,optional-arguments,Php,Class,Constructor,Optional Arguments,我有两个箱子 案例1:传递姓名和年龄 案例2:通过姓名和性别 我该怎么做 在PHP中可以有可选参数,但不能有任何一个/或参数,因为这需要函数重载,而PHP不支持函数重载。根据您的示例,必须按如下方式调用构造函数: // How do I pass specific arguments here? $case_1 = new User("Bob", null, 34); $case_2 = new User("James", "m"); 如果您想消除可选但必须为null的参数,那么您需要更
- 案例1:传递
和姓名
年龄
- 案例2:通过
和姓名
性别
在PHP中可以有可选参数,但不能有任何一个/或参数,因为这需要函数重载,而PHP不支持函数重载。根据您的示例,必须按如下方式调用构造函数:
// How do I pass specific arguments here?
$case_1 = new User("Bob", null, 34);
$case_2 = new User("James", "m");
如果您想消除可选但必须为null的参数,那么您需要更聪明
选项一:使用工厂。这将需要一个公共参数构造函数以及每个唯一参数的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");
工厂不需要是一个单独的类,如果需要,您也可以向用户类添加静态初始值设定项
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");
新用户(“Bob”,null,34)代码>@miken32我知道我可以将null传递到参数中,我不想在其中输入任何内容。但是,如果我不知道对象的内部结构是如何形成的,我怎么知道NULL
是默认参数?在python中你可以做User(age=34)
@miken32哦,我明白了,谢谢!事实上,我收回这句话,我在想别的事情。:)空值将被传递给函数。贴出的答案是你最好的选择。相关:那些静态工厂函数可能会返回用户:)另外new self(…)
(或者new static(…)
,如果你想实例化潜在的子类)会更优雅一些,但我在挑剔。谢谢,我在编写示例时有点匆忙。使用忘记返回和新静态(…)更新,用于通过静态初始值设定项对用户对象进行后期静态绑定。
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");