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

parent:: save() を呼び出すときは、DataStore_Adapter の save() メソッドを呼び出しているため、両方が同じクラスに属しているため、プライベート属性 $id が save() に表示されます。

于 2013-03-05T10:09:41.313 に答える
0

プライベートおよびその他のキーワードの詳細については、こちらをご覧ください。

于 2013-03-05T10:28:47.237 に答える