4

我需要直接从数据库中构建一个包含大量变量的类,为简单起见,我们将它们命名为“userX”,我对 ORM 进行了一些研究,但它在我的脑海中。

本质上我认为我可以使用我的程序代码

for ($i=0; $i<100; $i++) {
public ${'user'.$i};
}

但是,在一堂课

class test() {

  private $var1;

  for ($i=0; $i<10000; $i++) {
  public ${'user'.$i};
  }

  function __constructor .....

}

显然不是..但它给我留下了同样的问题,我怎样才能添加 $user0、$user1、$user2 等,而不必输入所有 10k ......

显然,从数据库中获取名称会容易 1000 倍,但同样,这看起来更难编码。我应该扣紧并抓住它们所有的 ORM 风格吗?

4

3 回答 3

18

您可以简单地使用魔术访问器来拥有任意数量的实例属性:

class test{

   private $data;

   public function __get($varName){

      if (!array_key_exists($varName,$this->data)){
          //this attribute is not defined!
          throw new Exception('.....');
      }
      else return $this->data[$varName];

   }

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

}

然后你可以像这样使用你的实例:

$t = new test();
$t->var1 = 'value';
$t->foo   = 1;
$t->bar   = 555;

//this should throw an exception as "someVarname" is not defined
$t->someVarname;  

并添加很多属性:

for ($i=0;$i<100;$i++) $t->{'var'.$i} = 'somevalue';

您还可以使用给定的一组属性初始化一个新创建的实例

//$values is an associative array 
public function __construct($values){
    $this->data = $values;
}
于 2012-09-08T11:42:11.410 回答
2

试试$this->{$varname}

class test
{

    function __construct(){

       for($i=0;$i<100;$i++)
       {

         $varname='var'.$i;
         $this->{$varname}=$i;
       }
    }
}
于 2015-12-18T22:43:54.140 回答
0

您可以使用变量变量 ($$var) - 一个变量的内容用作另一个变量的名称 (double $$)

因此不是 $this->varname 而是$this->$varname

class test
{
   for($i=0;$i<100;$i++)
   {
     $varname='var'.$i;
     $this->$varname=$i;
   }
}

这将动态创建 100 个变量,名称为 $var0, $var1 ...

于 2014-09-13T10:34:42.017 回答