0

这是我的课

abstract class DataStore_Adapter {

    private $id;

    abstract function update();
    abstract function insert();

    function __construct() {
        $this-> id = 3;
    }
    function save() {
        if(! is_null($this->id)) {
            $this->update();
        } else {
            $this->insert();
        }
    }
}

class VS_DataStroe_Adapter extends DataStore_Adapter {

    function __construct() {
        parent:: save();
    }
    function update() {
        echo "successfully updated!";
    }
    function insert() {
        echo "successfully inserted!";
    }
}

$vs_data = new VS_DataStroe_Adapter();

运行此代码我得到结果

插入成功!

如果我删除

$this-> id = 3;

从 DataStore_Adapter 的构造方法并将其放在函数 save() 中,它给了我结果;

成功更新!

我需要澄清这种行为。由于我已将 $id 声明为私有变量,因此我知道它只能通过 DataStore_Adapter 类访问。但是当我在 save() 方法中初始化它时,子类可以访问它的值。这怎么可能?为什么?

4

3 回答 3

2

私有属性只能在声明它的类的范围内访问。Save() 在父类(声明 ID)中定义,因此它可以访问它。

换句话说private DataStore_Adapter::$id,可以访问,DataStore_Adapter::save()因为两者都定义在同一个类中。如果您想通过继承共享属性或方法,您可以使用protected.

于 2013-03-05T10:03:11.963 回答
0

您可以在此处阅读有关私有关键字和其他关键字的更多信息

于 2013-03-05T10:28:47.237 回答
0

当您调用 parent:: save() 时,您正在调用 DataStore_Adapter 的 save() 方法,因此私有属性 $id 对 save() 是可见的,因为两者属于同一类

于 2013-03-05T10:09:41.313 回答