Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.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_Class_Constructor_Optional Arguments - Fatal编程技术网

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");