3

クラスのさまざまなインスタンスが、互いのプライベート メンバー変数を認識できるようです。

私の問題を紹介しようとするいくつかのコードを提供しました。それを説明しようとします。

プライベート メンバ変数を持つクラスがあります$hiddenmodifyPrivateMemberの値を$hiddenに設定します3。をパラメーターとしてaccessPrivateMember取り、そのプライベートメンバーにアクセスしてその値を返します。Object $hidden

コード例:

<?php
// example.php

class Object {
    private $hidden;

    public function modifyPrivateMember() {
        $this->hidden = 3;
    }

    public function accessPrivateMember(Object $otherObject) {
        return $otherObject->hidden;
    }
}

$firstObject = new Object;
$firstObject->modifyPrivateMember();


$otherObject = new Object;
echo $otherObject->accessPrivateMember($firstObject);

上記のコードの出力:

$ php example.php
3

オブジェクトのプライベート メンバーが同じクラスの他のインスタンスにアクセスできる理由を説明できる人はいますか? この表向きの範囲の違反には正当な理由がありますか?

4

3 に答える 3

3

privateそのオブジェクトだけでなく、そのクラスだけに制限されていることを意味します。

于 2009-08-18T20:26:33.520 に答える
3

それがphpの仕組みです。Javaの仕組みと同じです。詳細については、 http://php.net/manual/en/language.oop5.visibility.phpを参照してください。

于 2009-08-18T20:18:57.857 に答える
1

この動作が有用と思われる唯一の状況は、factory関数内でした:

class Object
{
    private $state;

    public static function makeObject()
    {
        $obj = new Object;
        $obj->state = 'some state';
        return $obj;
    }
}

この場合でも、より良い解決策があり、私の意見ではそれほど大きくはありませんが、それが範囲の違反であることに同意します。結局のところ、クラスを作成する人は、引数として渡されたオブジェクトからプライベート メンバーにアクセスする必要があるかどうかを決定します。だから、それは(私にさえ)役に立たないように見えるかもしれませんが、あなたは決して知りません. 内部をサブクラスなどに公開しているわけではありません。それはすべて同じクラスで行われ、そこで何をするかはあなた次第です。

ところで、クラスごとではなくオブジェクトごとにアクセス修飾子を実装する言語の 1 つに Ruby があります。

于 2009-08-18T23:08:53.507 に答える