BaneStar007
BaneStar007

Reputation: 415

PHP trying to create dynamic variables in classes

I need to construct a class with alot of variables directly from the Database, For simplicity we'll name them 'userX', I've looked into ORM just a little, but its way over my head.

Essentially I thought I could use my procedural code

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

But, in a class

class test() {

  private $var1;

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

  function __constructor .....

}

Obviously not.. but it leaves me with the same problem, how can I add $user0, $user1, $user2, etc etc, without having to type all 10k of them in..

Obviously, it would be 1000x easier to just grab the names from the Database, but again, that looks even harder to code. Should I buckle down and grab them all ORM style?

Upvotes: 4

Views: 20479

Answers (3)

RafaSashi
RafaSashi

Reputation: 17225

Try $this->{$varname}

class test
{

    function __construct(){

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

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

Upvotes: 3

sbrbot
sbrbot

Reputation: 6469

You can use variable variables ($$var) - content of one variable is used as a name for other variable (double $$)

Therefore not $this->varname but $this->$varname.

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

This will dynamically create 100 variables with names $var0, $var1 ...

Upvotes: 0

ibtarek
ibtarek

Reputation: 795

You could simply use the magic accessors to have as many instance attributes as you wish :

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;
   }

}

Then you could use your instance like this :

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

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

And to add a lot of attributes :

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

You could also initialize a newly created instance with a given set of attributes

//$values is an associative array 
public function __construct($values){
    $this->data = $values;
}

Upvotes: 19

Related Questions