如何为对象创建默认值? 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分类为MaleFemale 类那么你为什么要在构造函数中使用$gender 参数来打扰自己,如果我是你,我会省略该参数并将其隐式设置为@中的 "male" 987654331@ 类和Female中的 "female" @Abdo Adel 啊!我明白你的意思,这将是多余的,因为我必须在男性和女性中设置默认值,为什么还要麻烦在人类中设置变量?但是随后必须在男性和女性中设置 getGender,而不是在 Human 中设置 getGender。有很大区别吗?很抱歉还在漫长的学习过程中。 如果@Dora 想要有两个以上的性别怎么办? ;) @Dora 不,我不是要从类中省略属性$gender,我的意思是从构造函数中省略它并在构造函数中手动设置它(@987654335 中的$this-&gt;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的主要内容,如果未能解决你的问题,请参考以下文章

c# 如何为聚合对象的变量创建属性?

如何为名称/值结构创建 JSON 模式?

从 PHP 中的空值创建默认对象?

Rails:如何为 Rails activerecord 模型中的属性创建默认值? [复制]

PHP 5.4:禁用警告“从空值创建默认对象”

在sql创建数据库表时,如何为字段设一个默认值