14

クラスが挿入データを操作するためのgetメソッドとsetメソッドを持っているいくつかのプロジェクトを見てきました。ここに例を挙げましょう:

    class Student extends dbClass
{
    private $TableID;
    private $FullName;
    private $Gender;
    private $Address;




    function setTableID($Value)
    {
        $this->TableID = $Value;
    }

    function getTableID()
    {
        return $this->TableID;
    }

    function setFullName($Value)
    {
        $this->FullName = $Value;
    }

    function getFullName()
    {
        return $this->FullName;
    }

    function setGender($Value)
    {
        $this->Gender = $Value;
    }

    function getGender()
    {
        return $this->Gender;
    }

    function setAddress($Value)
    {
        $this->Address = $Value;
    }

    function getAddress()
    {
        return $this->Address;
    }


    function UpdateStudent()
    {
        $sql = "UPDATE INTO usertable SET
        FullName = '".$this->getFullName()."',
        Gender = '".$this->getGender()."',
        Address = '".$this->getAddress()."'
        where TableID='".$this->getTableID()."'";
        $this->query($sql);
    }
}

上記は私が見たクラスの例です。そして、以下は彼らがそれをどのように使用しているかのプロセスです:

$student = new Student;
$student->setTableID = 1;
$student->setFullName('My Name');
$student->setGender('Male');
$student->setAddress('this is my address');

$studen->UpdateStudent();

このようにする価値はありますか?個人的には、フィールドを設定して、その中のレコードを取得して更新するのは役に立たないと思います。すべてのモジュールでそれを作成するには、本当に多くの時間がかかります。そのようなことを処理するための最良の方法は何ですか?このようにそれを行うことに関係するセキュリティはありますか?

4

4 に答える 4

14

このようにする価値はありますか?

場合によります。

「スマート」プロパティ(つまり、ゲッターやセッター)を公開してユーザーからフィールドを抽象化することには、次の2つの欠点があります。

  1. より多くのコードを書く必要があります。プロパティが実際にスマートなことを何もしない場合、これは何の役にも立たないコードです。
  2. プロパティのユーザーは、もう少し入力する必要があるため、少し不便です。

そしてそれは1つの利点があります:

  1. 将来的には、ユーザーのコードを壊すことなく、以前はロジックがなかったとしても、プロパティにロジックを追加できます。

この利点が意味のあるものである場合(たとえば、再利用可能なソフトウェアライブラリを作成している場合)、ベアフィールドの代わりにプロパティを作成することは非常に理にかなっています。そうでなければ、あなたは利益のために仕事をしていません。

そのようなことを処理するための最良の方法は何ですか?

マジック__get__set関数をオーバーライドして(おそらく基本クラスでオーバーライドを継承できるように)、プロパティアクセスをゲッターとセッターに自動的に転送できます。簡略化されたコード:

public function __get($name) {
    $getter = 'get'.$name;
    if (method_exists($this, $getter)) {
        return $this->$getter();
    }

    $message = sprintf('Class "%1$s" does not have a property named "%2$s" or a method named "%3$s".', get_class($this), $name, $getter);
    throw new \OutOfRangeException($message);
}

public function __set($name, $value) {
    $setter = 'set'.$name;
    if (method_exists($this, $setter)) {
        return $this->$setter($value);
    }

    $getter = 'get'.$name;
    if (method_exists($this, $getter)) {
        $message = sprintf('Implicit property "%2$s" of class "%1$s" cannot be set because it is read-only.', get_class($this), $name);
    }
    else {
        $message = sprintf('Class "%1$s" does not have a property named "%2$s" or a method named "%3$s".', get_class($this), $name, $setter);
    }
    throw new \OutOfRangeException($message);
}

警告エンプター:__get__setはオーバーライドされるため、オーバーライドする必要が__issetあり__unsetます。

このようにそれを行うことに関係するセキュリティはありますか?

いいえ、まったくありません(誤ってバグを挿入しないと仮定します)。

于 2012-05-16T10:48:19.053 に答える
6

プロパティ(実際には関数呼び出しにつながるパブリックメンバー「変数」)を持たない言語では、通常、パブリック変数の代わりにゲッター/セッターを使用することをお勧めします。そうしないと、他のユーザーがすでにプレーンフィールドを使用している場合、後でロジックを追加できません(たとえば、変数を設定するとき)。

PHPは(残念ながら)そのような言語なので、答えはイエスです。それらを使用してください

于 2012-05-16T10:48:22.043 に答える
2

セッターとゲッターを作成すると、OOPカプセル化を実施するのに役立ちます。PHPについてはよくわかりませんが、他の多くの言語(Java、C ++)の場合、優れたIDE(Eclipse / NetBeans)がこれらのセッターとゲッターを自動生成します。

単純なタイプの場合はすぐにはわかりませんが、より複雑な処理を実行する必要がある場合は、より明白になります。

于 2012-05-16T10:46:07.363 に答える
1

時々ゲッターとセッターを使用する理由の例:200の異なるファイルに値を設定するコードがあります:

$cat->name = 'Fery'          // in file one
$favoriteCat->name = 'Tery'  // in another file
$fatCat->name = 'jery'             // in another file
// 200 more calls in alot of places

顧客が突然新しい要件を持っていると想像してください。「すべての猫の名前の前に「Sweet」を付ける必要があります。

ここで、猫のすべての宣言を見つけて、それらの割り当てを置き換える必要があります。

$cat->name = 'Sweet '.'Fery'
// times 200   

一方、setterメソッドを使用した場合、必要なのは、「Sweet」を1か所に追加するコードを追加することだけです。

public function setCatname($catname)
{
  $this->catName = 'Sweet ' . $catname;
}
于 2018-07-05T08:44:30.480 に答える