在PHP中尝试在类中创建动态变量

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方式获取它们吗?


下载Magento开源项目并尝试阅读Varien_Object类中的代码。这将为您提供实现目标以及搜索什么内容的相当好的想法。 - Mihai Todor
3个回答

19
您可以简单地使用魔术访问器来拥有任意数量的实例属性:
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;
}

你正在从类外分配值,我需要在类内实例化变量,你写的代码可以实现吗?我试一下...不行:解析错误:语法错误,意外的T_FOR,期望T_FUNCTION。 - BaneStar007
2
在类构造函数中,使用"$this"也应该可以正常工作:$this->{'var'.$i} = 'value'。 - ibtarek
或许我有脑子堵塞,但在构造函数中,你调用了尚不存在的变量。我原本以为你必须在构造函数之前声明变量。 - BaneStar007
或者你可以简单地将一个关联数组分配给 $this->data。$this->data = array('var1'=>'val1','var2'=>'val2', .....); - ibtarek
1
PHP在设置类属性时不需要其存在,但是当您尝试读取尚未定义的类属性时,它会触发一个错误。 - ibtarek
显示剩余2条评论

3
尝试使用$this->{$varname}
class test
{

    function __construct(){

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

         $varname='var'.$i;
         $this->{$varname}=$i;
       }
    }
}

0

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

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

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

这将动态创建100个变量,它们的名称为$var0、$var1等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接