0

通常、PHPクラスを作成するときは、次のようなことをしました。

class MyClass () {
   public attribute1;
   public attribute2;
   public attribute3;
}

ロジックに基づいて属性を設定することは可能ですか?

class MyClass () {

   public function __construct() {
      if (some condition) {
         public attribute1;
         attribute1 = 23;
      } else {
         public attribute1;
         attribute1 = 55;
         public attribute2;
         attribute2 = 11;        
      }
   }
}
4

6 に答える 6

3

他の人が言ったように、を使用しますが、クラスで宣言されていない変数が好きではない$this->param = 11;ため、このアイデアは好きではありません。

クラス定義で変数を宣言するのは読みやすさのためであり、private、public、および protected を設定できます。Java ではこれは許可されていないため、php ではエラーになるはずです。

どの変数を使用するかわからない場合は、魔法のメソッド _ get()_set()

コード例:

class MyClass {

    private $store = [];

    public function __get($name)
    {
        return isset($this->store[$name]) ? $this->store[$name] : null; # or output error
    }

    public function __set($name, $value)
    {
        $this->store[$name] = $value;
    }

    public function __construct()
    {
        if (rand(0,1)) {
            $this->attribute1 = 12;
        } else {
            $this->attribute2 = 21;
        }
    }

}

var_dump( (new MyClass)->attribute1 );
var_dump( (new MyClass)->attribute1 );
var_dump( (new MyClass)->attribute1 );

出力:

int(12)
NULL
int(12)
于 2012-09-26T20:39:33.487 に答える
2

はい、しかしあなたはこのようにします:

class MyClass () { 

   public function __construct() { 
      if (some condition) { 
         $this->attribute1 = 23; 
      } else { 
         $this->attribute1 = 55; 
         $this->attribute2 = 11;         
      } 
   } 
} 

属性は常に公開されます。

于 2012-09-26T20:40:01.313 に答える
2

属性は、最初にアクセスされたときに作成されます。他の人が言ったように、それは良い習慣とは見なされず、モンキーパッチと呼ばれ、動的言語(つまり、少なくとも開発者側ではコンパイラが関与しないもの)でのみ可能です。

フィールドを一元化された場所に保管しないと、自動生成ツールが機能せず、コード アシスタントが機能せず、コードベースへの他の貢献者がコードを理解するのに苦労する可能性があるため、これはお勧めできません。

ただし、それは必ずしも悪い習慣ではありません。たとえば、CakePHP (MVC フレームワーク) は、次の手法を使用して、特定のクラスの作成を高速化します。Controllerこのようにクラスを拡張すると

class ThingsController extends AppController {

  var $components = array("Foo", "Bar", "Baz");

  function index() {
    $this->Foo($this->Bar->bar());
  }

}

変数は基本クラス コンストラクターによって調べられ、、およびクラス$componentsが動的に読み込まれ、insideのようなインスタンス変数で自動的に使用可能になります。ただし、これはドキュメントに明確に記載されており、最新のフレームワークでマジック変数、つまりコードで直接宣言されていない変数を提供するために徹底的に使用されている規則です。この使用法はタイピングを節約しますが、前述のツールからのサポートを壊すという代償を伴います - 新しい開発者がしばしば頭痛の種になることは言うまでもありません:PFooBarBaz$this->FooThingsController

于 2012-09-26T20:55:32.497 に答える
1

存在しないプロパティは、最初に呼び出されたときに作成されます。

class MyClass () {

   public function __construct() {
      if (some condition) {
         $this->attribute1 = 23;
      } else {
         $this->attribute1 = 55;
         $this->attribute2 = 11;        
      }
   }
}

しかし、そうすることは良い習慣ではありません。このように、プロジェクト内の任意の場所でプロパティ宣言を検索する必要があります。あなたのチームメイト(もしあれば)またはあなたの将来の自己について考えてください。クラスが持つすべてのプロパティを明示的に定義する必要があります。そうしないと、どこで定義したかを確実に忘れてしまいます。

于 2012-09-26T20:40:03.170 に答える
0

はい、public attribute1;'メソッド内では使用しません。$this->attribute1 = 23;またはを使用します$this->attribute2 = 11;

于 2012-09-26T20:39:46.947 に答える
0

もちろん。

class MyClass () {
   public $attribute1;

   public function __construct($an_array = NULL) {
      if ($an_array) {
         $this->attribute1 = $an_array;  
      }
   }
}
于 2012-09-26T20:39:56.197 に答える