web-dev-qa-db-ja.com

PHP:オブジェクト変数を作成する方法?

だから例えば私はこのコードを持っています:

class Object{
    public $tedi;
    public $bear;
    ...some other code ...
}

ご覧のとおり、このクラス内にはパブリック変数があります。私がしたいのは、これらの変数を動的な方法で、次のような関数で作成することです。

private function create_object_vars(){

   // The Array what contains the variables
   $vars = array("tedi", "bear");

   foreach($vars as $var){
      // Push the variables to the Object as Public
      public $this->$var;
   }
}

では、パブリック変数を動的に作成するにはどうすればよいですか?

12
Adam

はい、できます。

あなたはかなり正しいです-これはそれをするべきです:

private function create_object_vars(){

   // The Array of names of variables we want to create
   $vars = array("tedi", "bear");

   foreach($vars as $var){
      // Push the variables to the Object as Public
      $this->$var = "value to store";
   }
}

これは 変数変数の名前付け を利用していることに注意してください。

コメントのとおり、このように作成されたメンバーは公開されます-保護された/プライベートな変数を作成する方法は確かにありますが、おそらく簡単ではありません(たとえば、拡張機能でC Zend APIを介して行うことができます)。

7
John Carter
$vars = (object)array("tedi"=>"bear");

または

$vars = new StdClass();
$vars->tedi = "bear";
38
bfg9k

別の方法として、ArrayObjectからオブジェクトを派生させることもできます。そのため、配列の振る舞いと属性の注入を容易にするいくつかのメソッドを継承します。

_class YourObject extends ArrayObject {

    function __construct() {
        parent::__construct(array(), ArrayObject::PROPS_AS_ARRAY);
    }

    function create_object_vars() {
        foreach ($vars as $var) {

            $this[$var] = "some value";

        }
    }
_

属性は、同様に_$this->var_および_$this["var"]_として同様に使用できます。これらは、ユースケースに適している場合とそうでない場合があります。属性を設定する別の方法は$this->offsetSet("VAR", "some value");です。

ところで、変数変数については何も悪いことはありません。これらは、ArrayObjectを再利用する場合と同様に、適切な言語構成要素です。

5
mario