php:嵌套类结构上的属性继承

时间:2018-11-14 08:19:18

标签: php oop inheritance

我不清楚在PHP 5.4.7中如何实现类继承(几乎是旧的!我知道!)。 考虑以下示例:

$ bash compilewargs.sh compilewargs.sh foo bar baz
error: first argument not a c/c++ file

如果我按顺序打电话

Class ClassA {
    public $property = array();
    function __construct() {
        $this->property[] = "ClassA.construct";
    }
    public function SetA() {
        $this->property[] = "ClassA.Set";
    }
}

Class ClassB extends ClassA {
    function __construct() {
        $this->property[] = "ClassB.construct";
    }
    function SetB() {
        $this->property[] = "ClassB.Set";
    }
}

的预期行为是...

$classA = new ClassA();
$classA->SetA();
$classB = new ClassB();
$classB->SetB();
print_r($classB->property);

...但是我却得到了...

Array
(
    [0] => ClassA.construct
    [1] => ClassA.Set
    [2] => ClassB.construct
    [3] => ClassB.Set
)

那么,我这边怎么了? 如何将子元素添加到父对象定义的数组中?

4 个答案:

答案 0 :(得分:3)

您通常会误解继承的工作原理:$classAClassA的一个实例,与您生成的$classB的实例ClassB无关。

ClassB的实例继承了ClassA的所有公共和受保护的属性和方法,但是只要您不使用它们,就不会看到它们。

所有实例,无论是来自ClassA还是来自ClassB的实例,都是彼此无关的,它们只有相同的“模板”,但每个实例都有自己的属性值。

答案 1 :(得分:1)

这很简单:如果您忘记在ClassB中调用父构造函数,为什么还要运行它呢?根据{{​​3}}的说法,自PHP 5.0.0起,这没有改变,并且在最新的PHP 7版本中仍然有效

答案 2 :(得分:1)

在PHP中,不会自动调用父级构造函数,因此,您需要执行以下操作:

Class ClassB extends ClassA {
    function __construct() {
        parent::__construct();
        $this->property[] = "ClassB.construct";
    }
    function SetB() {
        $this->property[] = "ClassB.Set";
    }
}

而且最多,您会得到这个

Array
(
    [0] => ClassA.construct
    [2] => ClassB.construct
    [3] => ClassB.Set
)

因为从未SetA()被调用

调用所描述的序列时,$classA$classB是两个不同的实例,因此您将永远无法获得期望的结果。

要获得想要的东西,您需要这样做:

$classB = new ClassB();
$classB->SetB();
$classB->SetA();
print_r($classB->property);

答案 3 :(得分:1)

如果要获得预期的结果,则需要按照PHP oops概念更改代码,但这将无法按您的意愿进行。

您更新了代码

Class ClassA {
    public $property = array();
    function __construct() {
        $this->property[] = "ClassA.construct";
        $this->SetA();
    }
    public function SetA() {
        $this->property[] = "ClassA.Set";
    }
}

Class ClassB extends ClassA {
    function __construct() {

        parent::__construct();//invoke parent constructor       
        $this->property[] = "ClassB.construct";
    }
    function SetB() {
        $this->property[] = "ClassB.Set";
    }
}


$classB = new ClassB();
$classB->SetB();
print_r($classB->property);

预期结果:

Array
(
    [0] => ClassA.construct
    [1] => ClassA.Set
    [2] => ClassB.construct
    [3] => ClassB.Set
)

调用parent::__construct();时,它还会为子类维护$property数组变量。

注意:众所周知,OOPS概念中的每个对象都有不同的实例。