0

私は .Net のバックグラウンドを持っており、PHP で慣れ親しんだプログラミング パターンに頭を悩ませようとしています。

連想配列プロパティを持つクラスがあります。連想配列キーのすべてではなく一部をクラスレベルのプロパティに「昇格」したいと思います。C# では、通常は次のようにします。

//C# Code
class MyClass{
    private Dictionary<string, string> attributes = new Dictionary<string,string>();

    //Get/Set the ID from the private store
    public string ID{
        get { return (attributes.ContainsKey("ID") ? attributes["ID"] : "n/a"); }
        set { attributes.Add("ID", value); }
    }
}

これにより、オブジェクトが欠落しているプロパティのデフォルト値を制御できるようになります。PHP では、これを直接行う方法が見つかりませんでした。私の最初の回避策は、単に関数を使用することでした:

//PHP Code
class MyClass{
  private $attributes = array();

  //Get the ID    
  public function getID(){
    return (array_key_exists('ID', $this->attributes) ? $this->attributes['ID'] : 'n/a');
  }
  //Set the ID
  public function setID($value){
    $this->attributes['ID'] = $value;
  }
}

これは機能しますが、呼び出し構文はわずかに異なり、プロパティごとに 2 つのメソッドがあります。また、これらのオブジェクトを使用しているコードは現在、オブジェクト変数を調べているため、関数が見つかりません。

次に、オブジェクト自体のマジック メソッド パス__setと、渡されたオブジェクトのマジック メソッド パスをたどり、ローカル変数の設定/取得を開始しました。残念ながら、基になる配列を直接変更した場合、これらのメソッドは呼び出されません。__getswitch case$name

私の質問は、PHP で、使用されるまで計算されないクラスレベルのプロパティ/変数を持つことは可能ですか?

4

2 に答える 2

2

PHP には、C# プログラマーが概念を理解できるようにプロパティがありません。そのため、メソッドをゲッターおよびセッターとして使用する必要がありますが、原理はまったく同じです。

class MyClass {
    private $attributes = array ();

    public function getSomeAttribute () {
        if (!array_key_exists ('SomeAttribute', $this -> attributes)) {
            // Do whatever you need to calculate the value of SomeAttribute here
            $this -> attributes ['SomeAttribute'] = 42;
        }
        return $this -> attributes ['SomeAttribute'];
    }
    // or if you just want a predictable result returned when the value isn't set yet
    public function getSomeAttribute () {
        return array_key_exists ('SomeAttribute', $this -> attributes)?
            $this -> attributes ['SomeAttribute']:
            'n/a';
    }

    public function setSomeAttribute ($value) {
        $this -> attributes ['SomeAttribute'] = $value;
    }
}

基本的に、実装で基本的なアイデアを正しく理解できましたが、多くの「ボイラープレート」コードを意味します。理論的には、__get と __set を使用してその多くを回避することができますが、これらを使用しないことを強くお勧めします。外から?」あなたが遭遇した問題。

于 2013-10-29T22:29:07.693 に答える
0

PHPでは、次のようなことができます:

<?php
class MyClassWithoutParams{
    function test(){
      return $this->greeting . " " . $this->subject;
    }
}

$class = new MyClassWithoutParams();
$class->greeting = "Hello";
$class->subject = "world";

echo $class->greeting . " " . $class->subject . "<br />"; //Hello World
echo $class->test(). "<br />"; //Hello World
?>

プロパティを使用するために、プロパティ、ゲッター、またはセッターを定義する必要はありません。もちろん、そうすることでコードが読みやすくなり、Eclipse (または任意の IDE) のオートコンプリート機能が探しているものを理解できるようになるため、そうすることをお勧めします。エンティティ、それも同様に機能します。

より一般的なアプローチは、クラスの代わりに連想配列を使用することですが、配列ではメソッドを定義できません。

<?php
$array = new array();

$array["greeting"] = "Hello";
$array["subject"] = "World";

echo $array["greeting"] . " " . $array["subject"]; //Output: Hello World
?>
于 2013-10-29T23:00:46.780 に答える