如何访问私有变量?

如何访问私有变量?

问题描述:

这是我的课如何访问私有变量?

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()方法子类可以访问它的值.. 这是可能的?为什么?

+0

代码显示“子类可以访问其值”的代码在哪里?在你发布的代码中,只有类本身访问它的值。 – DCoder 2013-03-05 10:00:50

+0

只有类本身(即'DataStore_Adapter')正在访问你的例子中的私有变量?在成员函数中访问私有成员变量没有问题... – BenM 2013-03-05 10:01:49

+0

好吧,如何在上面给出的示例中使用id = null?我想当子类访问这个父类时,每次调用DataStore_Adapter的构造函数时,都不能为null。 – guitarlass 2013-03-05 10:18:51

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

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

,当你调用parent ::保存(),您所呼叫的DataStore_Adapter的save()方法,因此,私人属性的$ id是可见的保存(),因为两者都属于同一类

你可以阅读更多关于私人和其他关键字here.