1

PHPのアクセサメソッドでパブリック変数とプライベート変数を使用することに関するアドバイス/経験を探しています。

例: $obj->foo = 'a'; echo $obj->foo;

vs $obj->setFoo('a'); echo $obj->getFoo();

パブリック変数について私が気に入っているのは、構文が短いことです。使用する作業が少ないようです。後でリファクタリングが難しくなる可能性があることは理解していますが、経験したことはありません (つまり、設計が変更されることもありますが、通常はアクセサー メソッドを変更する必要があります)。

もう 1 つのオプションは、変数を配列に格納し、魔法のメソッド (__get/__set) を使用して変数にアクセスすることです。これにより、リファクタリングまたはアクセサー メソッドを使用できるパブリック変数を簡単に使用できます。

PHP の世界で人々が何をしているかについての経験や参考文献。

そして、アクセサーメソッドを保持している人にとっては、最善の方法です.パブリック変数の有効な必要性/使用法はありますか?

4

4 に答える 4

7

はい、アクセサー メソッドはオーバーヘッドです。ただし、setter/getter を使用するための構文は、パブリック プロパティへの直接アクセスと同じくらいきれいです...少し冗長ですが、同じくらいきれいです。

アクセサー メソッドの最大の利点は、set メソッドを使用して値を検証し、不適切な値を拒否できることです (たとえば、常に整数であるべきプロパティを文字列または配列に設定しようとするなど)...ただし、この検証は外部の場合にのみ機能しますコードはプロパティに直接アクセスできません。

コードに関連するプロパティがあり、プロパティ A を変更するとプロパティ B も変更する必要がある場合の 2 番目の利点は、プロパティが公開されている場合、これを制御 (または強制) することはできません。

set メソッドを使用すると、流暢なインターフェイスを実装したり、次のようなインスタンスのコードをよりクリーンにすることができます。

echo $obj->setFoo('a');

それ以外の

$obj->setFoo('a'); echo $obj->getFoo();

set メソッドに return を含める場合

于 2010-09-13T09:03:48.383 に答える
0

ゲッター/セッターはJavaで生まれました。それらはスクリプト言語には適さないため、PythonやJavascriptなどでは嫌われています。それらはAPIをより面倒にします。

すでにご存知のように、__getを使用して変数アクセスをラップできます。これは、スクリプト言語でお勧めします。たとえば、中央の場所でタイプを検証できます。複数のセッター/ゲッターに重複したコードがありません。

 function __set($name, $value) {
     if (gettype($value) == $this->_types[$name]) {
          $this->_vars[$name] = $value;
     }
 }   // instead of twenty methods checking the type

中空のゲッター/セッターを実装して企業風のコードを作成するのは、コードの臭いです。また、副作用のあるゲッター/セッターを用意することもお勧めできません。複雑なオブジェクト操作には、常に実際のメソッド/メッセージを使用してください。

于 2010-09-13T09:08:38.223 に答える
0

セッターとゲッターは、検証/サニタイズの安定性を高めるため、常に最良のオプションです。

public function __call($name,$params = array())
{
    if(strstr('set',$name))
    {
    }//returns

    if(strstr('get',$name))
    {
    }//Returns

    if(strstr('run',$name))
    {
    }//Returns
}
于 2010-09-13T09:11:42.990 に答える