如何访问私有变量?
问题描述:
这是我的课如何访问私有变量?
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();
运行这段代码,我得到的结果
插入成功!
和如果删除
$这 - > ID = 3;
从DataStore_Adapter的构造函数方法,并将它放在函数save() 它给我的结果;
成功更新!
我需要澄清此行为。正如我已经声明$ id为一个私有变量,我知道它只能通过DataStore_Adapter类访问。但是,当我初始化它内部save()方法子类可以访问它的值.. 这是可能的?为什么?
答
私有属性只能在声明它的类的范围内访问。 Save()在父类(它声明了ID)中定义,因此它可以访问它。
换句话说private DataStore_Adapter::$id
可以通过DataStore_Adapter::save()
访问,因为两者都在同一个类中定义。如果你想通过继承来共享属性或方法,你可以使用protected
。
答
,当你调用parent ::保存(),您所呼叫的DataStore_Adapter的save()方法,因此,私人属性的$ id是可见的保存(),因为两者都属于同一类
代码显示“子类可以访问其值”的代码在哪里?在你发布的代码中,只有类本身访问它的值。 – DCoder 2013-03-05 10:00:50
只有类本身(即'DataStore_Adapter')正在访问你的例子中的私有变量?在成员函数中访问私有成员变量没有问题... – BenM 2013-03-05 10:01:49
好吧,如何在上面给出的示例中使用id = null?我想当子类访问这个父类时,每次调用DataStore_Adapter的构造函数时,都不能为null。 – guitarlass 2013-03-05 10:18:51