3

オーバーロードに関するPHPの仕様をよく読んだことがありますが、ほとんどの例は、カスタムフィールド(stdClassと同様)の定義を単純に許可することを目的としているようです。

しかし、私のクラスで定義されているプラ​​イベートフィールドはどうですか?これらはどのように取得/割り当てられる必要がありますか?可能な値を切り替えて、特定の値に基づいて行動することができます。

class A
{
    private $name;
    private $age;

    public function __get( $var )
    {
        switch ( $var )
        {
            case 'name':
                return $this->name;
                break;
            case 'age':
                return $this->age+10; // just to do something different ;)
                break;
            default:
                break;
        }
    }
}

これが最良の方法ですか、それとも一般的に受け入れられている別のベストプラクティスがありますか?(クラス内でクラス変数をループできるかどうかはわかりませんが、すべてを返したくないので、ほとんどの状況では適切ではありません。)

4

3 に答える 3

11

私は広範囲に使用し、__get()そして__set()私は自分のプロパティを宣言していますpublic。クラスインスタンスの名前を入力すると、IDEがパブリックプロパティを一覧表示できるように、両方の長所が必要でした。プロパティがパブリックでクラス外に表示されている場合でも、PHPインターセプターメソッドを機能させるにはどうすればよいですか?

unset()クラスで使用する必要__get()あるプロパティ__set()__construct()

この方法を理解するには、数晩の欲求不満がありました:-)

于 2009-07-26T22:54:11.960 に答える
2

これは効果的にそれらを公開します、そして通常これはあなたに単に公開プロパティを使用すること以上の何も得ません(しかしあなたはパフォーマンスペナルティを支払いそしてより多くのコードを書かなければならず、バグを危険にさらします)。

これは、パブリックプロパティを使用する既存のコードがあり、突然ゲッター/セッターが必要になった場合にのみ使用してください(の例のようにage)。

プロパティの読み取り/書き込み時にコードを実行する必要がある場合(たとえば、読み取り専用にするか、データベースから遅延フェッチする)、通常のゲッター/セッター(getAge()/ setAge())を使用する必要があります。

于 2009-07-25T02:05:37.990 に答える
1

使っている人はあまりいませんが、こう思います。

プライベート変数を取得するために、外部からアクセスできる定義済み変数のリストを提供することをお勧めします。次に、要求された変数がその配列にあるかどうかを確認します。そうである場合は、変更/取得できるようにします。そうでない場合は、エラーが発生するか、nullを返します。

正直なところ、これの実装は実際にはケースバイケースです。すべての情報を単一の配列に格納するユーザークラスがある場合は、$user->nameを$user->account['name']などから取得できます。

また、ケースバイケースでは、パスワードのハッシュなど、値を指定する前にいくつかの変更を行うことができます。

于 2009-07-25T01:50:02.613 に答える