2015-01-24 3 views
0

I'ld нравится динамически создавать столько объекта, который присутствует в моем $ массиве экземпляра (например domain1_com и domain2_com) и дать им название значения массива (например, domain1_com и domain2_com), так что я могу получить доступ к нему через эти имена (например, domain1_com->example()).Как создать динамически объекты на основе значений массива в php?

Возможно ли это? Я пробовал что-то вроде этого, но, очевидно, не работает.

class myClass 
    { 
     public static function getInstances() 
     { 
      // I connect to the database and execute the query 
      $sql = "SELECT * FROM my_table";  
      $core = Core::getInstance(); 
      $stmt = $core->dbh->prepare($sql); 

      if ($stmt->execute()) { 
       $results = $stmt->fetchAll(PDO::FETCH_ASSOC); 
      } 

      // Read values in my array 
      foreach ($results as $instance) { 

       $obj = $instance["domain"]); 
       // return 2 values: domain1_com and domain2_com 

       $obj = new myClass(); 
      } 
     } 

     public function example() 
     { 
      echo "This is an instance"; 
     } 
    } 

    myClass::getInstances(); 

    $domain1_com->example(); 
    $domain2_com->example(); 

ответ

2

Вы можете использовать переменные переменные.

$name = "foo"; 
$$name = new bar(); 

такая же, как

$foo = new bar(); 

Вы не можете получить доступ к переменным, созданные внутри getInstances снаружи этого метода. Они локальные, а не глобальные.

Попробуйте этот код:

class myClass 
{ 
    public static function getInstances() 
    { 
     $results = array('domain1_com', 'domain2_com'); 

     foreach ($results as $instance) { 
      $$instance = new myClass(); 
      // This is equivalent to "$domainX_com = new myClass();". 
      // Writing that code here would define a _local_ variable named 'domainX_com'. 
      // This being a method inside a class any variables you define in here are _local_, 
      // so you can't access them' _outside_ of this method ('getInstances') 
     } 

     // this will work, we are inside 'getInstances' 
     $domain1_com->example(); 
     $domain2_com->example(); 
    } 

    public function example() 
    { 
     echo "This is an instance"; 
    } 
} 

myClass::getInstances(); 

// this won't work. $domainX_com are not accessible here. they only exist _inside_ 'getInstances' 
// It's basic OOP. 
// so this code will crash 
$domain1_com->example(); 
$domain2_com->example(); 

Он будет производить этот вывод:

Это пример

Это пример

E_NOTICE: Тип 8 - Неопределенный переменная: domain1_com - по строке 32

E_ERROR: тип 1 - вызов функции члена (например) на не-объект - в строке 32

Вам нужен способ, чтобы получить доступ к этим переменным. Я бы использовал это:

class myClass 
{ 
    private static $instances = array(); 
    public static function getInstances() 
    { 
     $results = array('domain1_com', 'domain2_com'); 

     foreach ($results as $instanceName) { 
      self::$instances[$instanceName] = new myClass(); 
     } 
    } 

    public static function getInstance($instanceName) { 
     return self::$instances[$instanceName]; 
    } 

    public function example() 
    { 
     echo "This is an instance"; 
    } 
} 

myClass::getInstances(); 

// this will work 
myClass::getInstance('domain1_com')->example(); 
myClass::getInstance('domain2_com')->example(); 
+0

Спасибо, но я не могу получить доступ к объектам – KaMZaTa

+0

Что вы имеете в виду? вы обращаетесь к ним так же, как вы их создавали. –

+0

С внешней стороны класса, если я делаю '$ domain1_com-> example()' например, он ничего мне не показывает – KaMZaTa

Смежные вопросы