0

我正在尝试创建一个具有设置属性/数组的抽象类,然后在子类中向该属性/数组添加其他属性。我希望抽象类中定义的方法在从子类调用方法时使用子类属性/数组。我认为下面的代码应该可以工作......但它似乎仍在从父类访问该属性。

abstract class AbstractClass {

    protected static $myProp;

    public function __construct() {
        self::$myProp = array(
            'a' => 10,
            'b' => 20
        );
    }

    protected function my_print() {
        print_r( self::$myProp );
    }

}

class ClassA extends AbstractClass {

    protected static $myProp;

    public function __construct() {
        parent::__construct();
        self::$myProp = array_merge( parent::$myProp, 
            array(
                'c' => 30,
                'd' => 40
            )
        );
        $this->my_print( self::$myProp );
    }

}

$myObj = new ClassA;

这应该返回 Array ( [a] => 10 [b] => 20 [c] => 30 [d] => 40 ) 而不是返回 Array ( [a] => 10 [b] => 20 )

我怎样才能让它工作?!?

4

2 回答 2

2

像这样:

<?php

abstract class AbstractClass {

    protected static $myProp;

    public function __construct() {
        self::$myProp = array(
            'a' => 10,
            'b' => 20
        );
    }

    protected function my_print() {
        print_r( self::$myProp );
    }

}

class ClassA extends AbstractClass {

    public function __construct() {
        parent::__construct();
        self::$myProp = array_merge( parent::$myProp, 
            array(
                'c' => 30,
                'd' => 40
            )
        );
        $this->my_print( self::$myProp );
    }

}

$myObj = new ClassA;

您正在覆盖变量

于 2013-09-03T12:06:30.497 回答
1

实际上,在父类中,您没有定义my_print()包含任何参数的方法,此外,该方法使用self::$myProp(not static::)。此外,正如 Ka_lin 已经回答的那样,您不需要重新声明已在父类中声明的属性。

如果你这样做(由于某种原因需要重新声明它,比如设置不同于父级的预定义值),你可以做两件事:
一是,你可以更改my_print()为接受参数,然后print_r()参数不是self::$myProp

protected function my_print($debug) {
     print_r($debug);
}

或者,(在 PHP 版本 5.3.0 中。)您可以使用static::而不是self::

protected function my_print() {
     print_r(static::$myProp);
}

我会选择第二种选择。此外,您应该在 php 手册中
准备更多关于自我与静态(后期绑定)的信息

于 2013-09-03T12:20:40.263 回答