如何为对象创建默认值? PHP
Posted
技术标签:
【中文标题】如何为对象创建默认值? PHP【英文标题】:how to create default value for for an object? PHP 【发布时间】:2015-06-27 22:00:20 【问题描述】:假设我有一个 Human 类,它的变量 $gender 没有分配任何值。人类有一个构造函数,参数为年龄、性别、身高和体重。
我有另一个名为 Female 的类,它继承自 Human,但现在 Female 类用 Female
字符串覆盖 $gender 变量。
当我创建对象时让我们说$f = new Female(12, 'female', 123, 40);
创建对象时如何跳过输入女性?
我认为我们需要在 Female 类中创建另一个新的构造函数,而在 Female 类构造函数的参数中我有 age, gender = 'female', height and weight
但这似乎不起作用。
我尝试在创建对象时将性别部分留空或尝试输入空字符串,例如""
。
有人可以帮帮我吗?非常感谢。
我的人类类的代码
class Human
protected $age = 0;
protected $gender;
protected $height_in_cm;
protected $weight_in_kg;
function __construct($age, $gender, $heightCM, $weightKG)
$this->age = $age;
$this->gender = $gender;
$this->height_in_cm = $heightCM;
$this->weight_in_kg = $weightKG;
/**
* @return int
*/
public function getAge()
return $this->age;
/**
* @return string
*/
public function getGender()
return $this->gender;
女班代码
require_once('Human.php');
class Female extends Human
protected $gender = 'female';
function __construct($age, $gender = 'female', $heightCM, $weightKG)
$this->age = $age;
$this->gender = $gender;
$this->height_in_cm = $heightCM;
$this->weight_in_kg = $weightKG;
$f = new Female(12,'female',123,40);
echo "Your gender is ". $f->getGender()."<br>";
【问题讨论】:
你能把你的代码贴出来吗? 整个想法不正确(从我的角度来看),我的意思是如果你想将Human
分类为Male
和Female
类那么你为什么要在构造函数中使用$gender
参数来打扰自己,如果我是你,我会省略该参数并将其隐式设置为@中的 "male" 987654331@ 类和Female
中的 "female"
@Abdo Adel 啊!我明白你的意思,这将是多余的,因为我必须在男性和女性中设置默认值,为什么还要麻烦在人类中设置变量?但是随后必须在男性和女性中设置 getGender,而不是在 Human 中设置 getGender。有很大区别吗?很抱歉还在漫长的学习过程中。
如果@Dora 想要有两个以上的性别怎么办? ;)
@Dora 不,我不是要从类中省略属性$gender
,我的意思是从构造函数中省略它并在构造函数中手动设置它(@987654335 中的$this->gender = 'male'
@class 和 Female
相同),这样您就可以避免每次创建对象时都指定性别的冗余,并且从 Human
继承的函数 getGender
仍然有效
【参考方案1】:
只需重写构造函数:
class Human
public function __construct($age, $gender, $height, $weight)
class Female extends Human
public function __construct($age, $height, $weight)
parent::__construct($age, 'Female', $height, $weight);
【讨论】:
【参考方案2】:你可以在扩展类中设置值:
// If it should be possible to instantiate the Human
// class then remove the "abstract" thing at set the
// "gender" property in the constructer
abstract class Human
protected $gender;
protected $age;
public function __construct($age)
$this->age = $age;
class Female extends Human
protected $gender = "Female";
class Male extends Human
protected $gender = "Male";
虽然这行得通,但它确实没有多大意义。课程本身会告诉您人类的性别,因此您只需致电$human instanceof Female
。
$person = new Female(18);
if ($person instanceof Female)
echo "Person is female";
【讨论】:
我认为你没有抓住重点。在问题中,OP概述了性别,身高和体重也在父构造函数的签名中,并且OP很难为gender参数设置默认值。 @lxg 你可能是对的。我的印象是问题是关于如何扩展类,而不仅仅是关于参数顺序以及如何使它们成为可选的。如果对某人有帮助,我会在这里留下我的答案。【参考方案3】:您可以简单地覆盖构造函数:
abstract class Human
protected $age;
protected $gender;
protected $height;
protected $weight;
public function __construct($age, $gender, $height, $weight)
$this->age = $age;
$this->gender = $gender;
$this->height = $height;
$this->weight = $weight;
public function getGender()
return $this->gender;
class Female extends Human
public function __construct($age, $height, $weight)
parent::__construct($age, 'female', $height, $weight);
$female = new Female(12, 170, 60);
echo $female->getGender();
【讨论】:
啊!让我试试这个,我根本没想过。 这不是一个很好的例子。女性构造函数中的parent::__construct()
在哪里?您也不需要在父类中重复已经声明的属性。只需重新设置它们。
@Spooky 重置它们是什么意思?
@Spooky:您对冗余属性是正确的,删除它们。你的第一个问题到底是什么意思?
@Dora:我在儿童班也有年龄、身高和体重,这是多余的。【参考方案4】:
我认为,在你的构造函数中
__construct($var, $gender="female", $var, $var)
//rest assignment
应该这样做
或者,使用已设置 female
的 3 参数构造函数
【讨论】:
对不起,java编写构造函数的方式:P以上是关于如何为对象创建默认值? PHP的主要内容,如果未能解决你的问题,请参考以下文章