0

これは非常に単純に思えるかもしれませんが、そうであると確信しています。

PHP のクラスの保護されたプロパティは、クラス自体および継承されたクラス内でのみアクセスできることを理解しています。これまでの私のコードは次のとおりです。

class q {

    public $publicQ = "This is a public property";
    protected $protectedQ = "This is a proected property";

    public function displayProtected() {

        echo $this->protectedQ;

    }

}

$q = new q;
echo $q->publicQ; #prints "This is a public property"
echo $q->protectedQ; #nothing
$q->displayProtected();

私はドキュメントを読み、SOに関する他の回答を見ましたが、その概念は私には合いません。保護されたプロパティは実際に何をしますか?なぜそれらを使用するのでしょうか?なぜ私の例が機能しないのですか?

4

5 に答える 5

3

パブリックプロパティとメソッドを、外部に公開するAPIとして考え、プライベート/保護されたものを、クラスの「内部動作」として考えてください。外部の世界は、それを気にする必要がないだけでなく、混乱させることもできません。また。

ここに義務的な悪い車のアナロジーがあります:

Carクラスで公開するメソッドはとである可能性がdriveForward()ありdriveBackwards()ます。どちらもと呼ばれるメソッドを使用しますがtransmitTheDriveToTheWheels()、車のユーザーには関係がなく、ユーザーがアクセスすることもできないため、プライベートにすることで「非表示」にします。

あなたの車にはengine特性があります。あなたは間違いなく誰かが行くことによってエンジンをかわいい小さな子猫に置き換えることができることを望まない$car->engine = $kitty;ので、あなたはエンジンもプライベートにするでしょう。

最後に、あなたの車にはmileageプロパティがあります。ユーザーがマイレージを読み取ることはできるが、変更することはできないようにする必要があります。したがって、プライベートを作成し、パブリックメソッドmileageを公開します。getMileage()

ここで、クラスの「内部」のものをカプセル化するためにプライベートまたは保護を使用するかどうかは、クラスが拡張されることを期待するかどうかによって異なります。

于 2013-03-12T21:32:05.900 に答える
2

保護されたフィールドは継承できますが、echo $q->protectedQ; 非公開フィールドは表示も継承もできないように表示できません。

于 2013-03-12T20:39:53.993 に答える
0

保護された関数により、クラスがより柔軟になります。

どこかでデータをロードしなければならないクラスを考えてみてください。これには、ファイルからデータを読み取るデフォルトの実装があります。同じクラスを使用したいが、データの取得方法を変更したい場合は、サブクラスを作成してgetData()関数をオーバーライドできます。

于 2013-03-12T20:39:45.163 に答える
0

パブリック メソッドとの唯一の実際の違いは、おわかりのように、保護された関数は継承ツリー内のクラスまたは別のクラス内からのみアクセスできることです。

関数がクラス外から使用されることを意図していない場合は、関数を保護されていると宣言したくありません。これは、純粋にコードをより理解しやすく (読みやすく) し、バグや誤用の影響を受けにくくするための言語機能です。パブリック メソッドだけを使用して達成できないことは (機能の形で) ありません。

コードを他の人と共有している場合や、何らかのライブラリである場合に非常に便利です。

PHP に固有のものとして、PHP の魔法の getter および setter 関数 ( http://www.php.net/manual/en/language.oop5.overloading.php#object.set ) を使用する場合に特に便利なケースがあります。

public $a = '1';
protected $b = '2';

public function __get($name) {
    return $this->{$name}.' (protected)';
}

$obj->a; //1
$obj->b; //2 (protected)

例のように、変数を「保護」し、マジック関数で呼び出しをキャッチできます。変数を含むクラスを発行した後で、変数を返す前にクラス内で内部的に何らかの前処理を行うことにした場合に便利です。

于 2013-03-12T20:41:28.267 に答える
0

保護された/プライベート メソッドを使用して、コードを読みやすくし、パブリック メソッドで同じ機能が繰り返されないようにする機能を含めます。

プロパティを保護すると、セッターを介してアクセスを提供しない限り、オブジェクトが外部から変更されないように保護されます。

オブジェクトの使用方法をより詳細に制御できます。

于 2013-03-12T20:44:11.463 に答える