2

OOPはすべてデータのカプセル化に関するものであることを学びましたが、相互に関係のないクラス間でデータを渡すことについてはどうでしょうか(以下の例は使用する価値がありますextends)?

class Dog {
    private $secretVar;

    public function getSecretVar() {
        $this->secretVar = 'psst... only for rainbow!';
        return $this->secretVar;
    }
}

class Rainbow {
    public function __construct(Dog $Dog) {
        print_r($Dog->getSecretVar());
    }
}

$Dog = new Dog();
$Rainbow = new Rainbow($Dog);

// ... classes that don't need the $secretVar

$secretVarクラスDogとのみをカプセル化するにはどうすればよいRainbowですか?今のところ、誰でも電話をかけることができますがgetSecretVar()、カプセル化のポイント全体を打ち負かしているように見えるので、それを許可するのに苦労しています。

4

4 に答える 4

0

DogがRainbowを拡張したり、変数を共有するためだけにその逆を行ったりすることは意味がありません。

あなたが求めていることは可能かもしれませんが、私にはわかりません。可視性を使用したC++であればfriend、それは確かに可能です。

この場合、それを作成するpublicか、ゲッターとセッターを使用する必要があります。

于 2012-10-21T22:41:08.380 に答える
0

カプセル化は、変数の値をプログラムの残りの部分から隠すためではなく、プログラムの残りの部分が変数にアクセスする方法を完全に制御するためのものです。

変数privateを宣言することにより、変数に設定できる値を確認し、誰もが読み取る前に変数に変更を加えることができます。

一部のクラスのみに変数を読み取らせようとしても、実際の意味はありません。

リフレクションを使用して、どのクラスとメソッドがgetSecretVar()メソッドを呼び出すかを確認することで、実行しようとしていることを実現できますが、これはほとんど役に立ちません。

于 2012-10-21T22:41:24.810 に答える
0

あなたの場合、次のように使用できますprotected:( hasSecretを拡張するすべてのクラスがそれにアクセスできます)。

<?php
class HasSecret {
    protected $secretVar = 'psst... only for rainbow!';
}

class Dog extends HasSecret {
    public function getSecretVar() {
        return $this->secretVar;
    }
}

class Rainbow extends HasSecret {
    public function __construct(Dog $Dog) {
        print_r($Dog->getSecretVar());
    }
}

$Dog = new Dog();
$Rainbow = new Rainbow($Dog);
于 2012-10-21T22:45:15.650 に答える
0

これが解決策ですが、それは醜いです。

class Dog {
    private $secretVar = 'psst... only for rainbow!';    

    public function getSecretVar($caller == NULL) {

        // Here's the trick...
        if (get_class($caller) == 'Rainbow') {
            return $this->secretVar;
        } else {
            return '';
        }
    }
}

class Rainbow {
    public function __construct(Dog $Dog) {
        print_r($Dog->getSecretVar($this));
    }
}

$Dog = new Dog();
$Rainbow = new Rainbow($Dog);

// ... classes that don't need the $secretVar

メンテナンスが難しく、直感的ではないため、醜いです。本当にこれを行う必要がある場合は、設計に欠陥がある可能性があります。

于 2012-10-21T22:50:45.553 に答える