2012-05-09 5 views
1

Это некоторый псевдокод представляет собой мой код, который вы бы не рассматривали в области видимости.Ссылка на переменную класса по строкам

Тестер класса имеет частные вары, удерживайте классы. В массиве хранится базовое имя var. Панель функций пытается скомпоновать переменную в строке, а затем использовать ее. Если это невозможно, я понимаю, но я просто строю имя переменной.

Class Tester{ 

    private $preClass1post = new TestClass1(); 

    private $preClass2post = new TestClass2();; 

    private $preClass2post = new TestClass2();; 

    public $classBasicNames = array('Class1','Class2','Class3'); 

    function Bar(){ 
      foreach($classBasicNames as $classBasicName){ 

      $fullClassName = 'PreText'.classBasicName.'PostText'; 

      $fullClassName->DoWork(); 
      //always throws object does not exist 
      } 

} 

} 


        //actual code for context 
      $mapperName = 'mapper'.$entityName.'Stat'; 
      echo $mapperName; 
      $dbos = $this->{$mapperName}->fetchAll($options); 
+3

Ну, да, это, безусловно, не будет работать. Строки не являются объектами .... –

+0

Или вы можете настроить массив объектов (со строками как ключи) и прокрутить его. –

ответ

2

Прежде всего, вы, кажется, вызывая методы объектов - даже если вы вычислите строку, чтобы получить класс, вам все еще нужно создать экземпляр объекта.

Вы можете сделать:

$class = 'PreText'.classBasicName.'PostText'; 
$object = new $class(); 
$object->DoWork(); 

См пример 3 here или посетить связанные discussion.

Update:

Если имя переменной известно, используют $$fullClassName->doWork()

+0

класс инициализируется перед попыткой – Rawb

+0

Ему не нужно создавать экземпляр объекта, если он является статическим методом. – Tushar

+0

$ this -> $$ mapperName-> fetchAll ($ options); – Rawb