0

privatePHPでの変数やメソッドの使い方について考えてみました。

車のクラスなどについて話すつもりはありません。独自のスクリプトについて話したいと思います。

プログラマーとスクリプトの所有者のパブリックまたはプライベートの使用の違いは何ですか。

スクリプトが電卓であり、将来的にコードを修正するのは私だけです。メソッドのプライベート変数をいつ使用する必要がありますか。これにより、スクリプト内の何かがどのように変更されるのでしょうか?

また、変数に触れることについてですか?誰かが値を変更しようとして、個人的な理由で変更できなかった場合。彼はセッターを使用して直接変更しますか?

プライベート メソッドまたは変数が、プログラマーまたはエンド ユーザーにとってメリットがあることを示す良い例が必要です。

var私はいくつかのスクリプトをプログラミングしていましたが、クラスで使用しないようにある人に言われました。私は彼に理由を尋ねました。彼は、パブリックまたはプライベートを使用する必要があると言い、その理由を尋ねました。

変数を直接変更する方法がある場合、なぜセッターを使用するのですか?

変数を直接変更する方法があるのに、なぜ getter を使用するのでしょうか?

4

3 に答える 3

3

まず第一に、強力な OO クラスを開発するときは、クラスの内部セマンティクスをできるだけ公開しないようにする必要があります (明らかに機能に影響を与えずに)。

一部の変数は、クラス自体のコンテキスト内でのみ価値があり、クラスを使用する開発者には意味がありません。変数を public にすることで、クラスを使用する誰もがそのような変数を自由に変更できるようになります。PHP では、少なくとも起こり得る損害を軽減するタイプ セーフさえない場合に、これは特定の問題になる可能性があります。

これを考慮してください: いくつかの I/O 操作をラップするクラスがあります。呼びましょうFileReader

class FileReader {
    public $_handle;

    public function __construct($filepath) {
        $this->_handle = fopen($filepath, 'r');
        if ($this->_handle === NULL) {
            throw new Exception("Unable to open the file for reading");
        }
    }

    // ... the rest of the class
}

これで、クラスがファイルへのハンドルを開くことがわかります。$_handle変数をパブリックにすることで、クラスで作業しているすべての人に変数を公開しました。彼らは、あなたが開いている未加工のファイル ハンドルについて知る必要はありません。彼らは、あなたのナイス クラスを使用して読み取り操作を実行したいだけです。ただし、公開されています。見るだけでなく、変更することもできます。これは、特に他のコードが$_handle変数が有効であると想定している場合には、悪いことです。

$reader = new FileReader();
$reader->_handle = "I hope this doesn't break anything. /trololol";
$reader->someOperation(); // oh no! Our file handle has just been changed to something completely wrong, this is now going to the break the class.

このようなばかげたシナリオは、最初に変数を非公開にすることで完全に回避できます。各アクセス修飾子が何をするか、およびそれらをいつ適用するかのより多くの (そしてより良い) 例については、この回答を参照してください。

次に、ゲッターとセッターについて説明します。あなたの質問では、すべてのゲッターとセッターが次のように書かれていると想定しているようです:

class Foo {
    private $_bar;

    public function getBar() {
        return $this->_bar;
    }

    public function setBar($newBar) {
        $this->_bar = $newBar
    }
}

$_barその場合、最初に変数をパブリックに変更することと、それとの間に違いはありません。

ただし、ゲッター メソッドとセッター メソッドを使用すると、変数が外部開発者によってどのように設定されているかを制御できるため、いつブーブーを作成するかを即座に検出し、後で未定義の動作を回避できます。例えば:

class Foo {
    private $_bar;

    public function getBar() {
        return $this->_bar;
    }

    public function setBar($newBar) {
        // Now we're going to ensure that $newBar is always an integer
        if (!is_int($newBar)) {
            // not an integer, throw out an exception to let the developer know that somewhere is setting invalid input
            throw new Exception("Expected an integer value for 'Bar'");
        }
        $this->_bar = $newBar;
    }
}

これにより、クラスがはるかに堅牢になるだけでなく、クラスを使用する開発者の作業が非常に簡単になります。クラスが の破損した値を使用しようとしたときに、後でどこかで非常に奇妙な問題をデバッグするのではなく、破損し$_barた値がどこから設定されたかをスタック トレースから簡単に判断し、ソースで修正することができます。

変数アクセスとゲッター/セッター メソッドに関するドキュメントはたくさんあります。これはさまざまな言語に適用されます。C++/C#/VB.NET に基づいた記事を参照することを恐れないでください。同じ資料に変換します。

于 2013-03-01T07:32:01.990 に答える
1

エンド ユーザーにはコードが表示されないため、(不) 利点はありません。

プログラマーにとって、オブジェクトの外部で必要のないものを宣言することはprivate、優れたプログラミング手法であり、保護メカニズムです。技術的には、あなたが完璧なプログラマーであり、コードの外観を気にしない場合、 を使用しprivateても何のメリットもありません。ただし、プライベート メンバーはブラック ボックス モデルを強制します。つまり、オブジェクトがどのように動作するか (外部から見たとき) ではなく、オブジェクトが何をするかだけを気にします。最後に、何らかの理由であなた (または他の誰か) があなたのコードを使用する必要がある/したい場合、彼らは機能を得るためにどのメソッドとプロパティを使用/呼び出すかを知っています。オブジェクトが維持する必要がある内部値を変更することなく、オブジェクトが持っています。利点がある場合とない場合があります。コードがどのように見えるかだけです。それが優れたプログラミング プラクティスの目的であり、経験上、エラーを最小限に抑える傾向があるため、通常はそれらに従います。

に関してはvar、廃止されました。つまり、将来的に削除される可能性があります (そして削除される予定です)。

于 2013-03-01T07:27:06.037 に答える
0

Public、Private、および Protected は、それらが関数の一部またはクラスの一部である場合にのみ、PHP で重要になります。

変数を一度設定して「ロック」したい場合は、値を後で変更できないようにするか、 (定数)defineとして設定できます。const

その変数/関数をどこからでも、他のクラスやオブジェクトのインスタンスから利用できるようにするパブリックスコープ。

変数/関数を独自のクラスでのみ表示する場合は、プライベート スコープを使用します。

親クラスを含む現在のクラスを拡張するすべてのクラスで変数/関数を表示する場合は、スコープを保護します。

ここを参照してください: http://php.net/manual/en/language.oop5.visibility.php

于 2013-03-01T07:27:54.743 に答える