Обращение к объекту класса используя переменные. Синтаксис.

Bermuda

Новичок
Обращение к объекту класса используя переменные. Синтаксис.

PHP:
<?php
	class MyClass {
		protected $objFooSomeSufix;
		protected $objBarSomeSufix;

		function MyFunc() {
			$this->objFooSomeSufix = new MyClass();
			$this->objBarSomeSufix = new MyClass();

			$this->objFooSomeSufix->Value = "My cool vaue";
			$this->objBarSomeSufix->Value = "The second one";

			//Здесь мы эмулируем некий функционал, который определяет
			//с каким объектом следует работать далее.
			$names = array("Foo", "Bar");
			$some_value = mt_rand(0,1);

			//Обращаемся к объекту через eval, но мне это кажется неправильным
			eval('$res = $this->obj' . $names[$some_value] . 'SomeSufix->Value;');
			//А такое обращение естественно приводит к ошибке парсинга
			//$res = $this->('obj' . $names[$some_value] . 'SomeSufix')->Value;
			print $res;
			}
		}

	$myclass = new MyClass();
	$myclass->MyFunc();
?>
Как обратится к объекту в данном частном случае, когда имя по которому следует обращаться это переменная?

Конечно можно сделать switch/case, однако с ростом количества объектов он также будет расти.
Здается мне, я пропустил какую-то главу по синтаксису PHP.
Ткните носом, пожалуйста. Спасибо.

-~{}~ 27.06.06 20:28:

?
 

Shturm

Гигант мысли
$classname = $names[$some_value]."SomeSufix";
$this->$classname->Value;

А случайный выбор объекта, если не секрет, зачем?
Может лучше все же сделать один объект?
 

Bermuda

Новичок
Автор оригинала: Shturm
А случайный выбор объекта, если не секрет, зачем?
На этом месте может быть любой функционал, например выбор пользователя (тоже, кстати, случайный).

Shturm
Спасибо, работает. Вот если бы без промежуточной переменной.

svetasmirnova
А мне не нужно вызывать метод, мне нужно свойство прочитать.

Я тормоз. Вот так нужно было.
$res = $this->{'obj' . $names[$some_value] . 'SomeSufix'}->Value;
Я же говорю, пропустил что-то :)
 

whirlwind

TDD infected, paranoid
Bermuda: 80% кода - бессмыслица. Или перепешите класс, или расскажите что вы хотите получить.

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

Shturm

Гигант мысли
Bermuda
Хотя авторская задумка понятна не до конца, но, все же -
зачем создавать десять объектов только для того, чтобы потом выбрать, с каким работать?
может все-таки лучше что-то вроде:
PHP:
<?
    class MyClass {
        protected $object;
        function MyFunc(){
            $class = mt_rand ... ;
            $this -> object = new $class();
            $this -> object -> property;
            //Или $this->object->getProperty('property'); - если свойства 
            //у разных объектов не одни и те же
        }
?>
 

Bermuda

Новичок
Автор оригинала: whirlwind
Bermuda:Если вы создаете множество объектов одного класса для последующего выбора, то не проще-ли сделать выбор из данных и работать с одними экземпляром? Если у вас множество только в этом примере, а в реальном коде оно определяется где-то снаружи, то почему не использовать массив экземпляров/данных?
Во-первых вопрос был не в этом. Читайте внимательно вопрос.
Не вижу никаких проблем в создании нескольких объектов одного класса, но с разными свойствами.

зачем создавать десять объектов только для того, чтобы потом выбрать, с каким работать?
Shturm , whirlwind Попробую вкратце объяснить:
Создается несколько объектов одного класса. Например это тектсовые поля ввода в форме. Они ведь к одному классу принадлежат, не так ли? Также присутсвует некий объект, скажем, радиобутон, которым управляет пользователь. В зависимости от выбора пользователя нужно показывать один объект или другой.
Я ожидаю, что мне предложат создавать объекты после выбора пользователя, но объекты в моем частном случае создаются до выбора пользователя, более того живут долго, так как пользователь может менять свой выбор, а создавать и уничтожать объекты по требованию это очень накладно, проще создать их заранее и лишь потом выбирать нужный.

Автор оригинала: whirlwind
Bermuda: 80% кода - бессмыслица.
Конечно, это ведь пример :)
Бонус для искателей смысла или если охота покапаться с исходником
http://phpclub.ru/paste/index.php?show=1277
Смотрите, например, строку 517. Но там все то же самое, что я описал.
Это Qcodo framework. Хотя наверное зацикливаясь на вэбе другие идеологии иногда бывает трудно понять.
 

whirlwind

TDD infected, paranoid
>Не вижу никаких проблем в создании нескольких объектов одного класса, но с разными свойствами

Это - бред и не правильно. Класс - это тип. Тип - это определенный набор данных. Это значит что у каждого экземпляра класса одинаковый набор данных. Если PHP позволяет делать неправильно, не значит что так и надо делать.

>Бонус для искателей смысла или если охота покапаться с исходником
http://phpclub.ru/paste/index.php?show=1277

Это не бонус для искателей смысла, а еще один антипатерн - как не надо делать контроллер. В этом бреде даже разбираться не стоит. Хотя это http://phpclub.ru/paste/1278 трудно назвать эталоном, но здесь хотя бы можно разобраться что происходит.
 

Bermuda

Новичок
Автор оригинала: whirlwind
>Не вижу никаких проблем в создании нескольких объектов одного класса, но с разными свойствами
Это - бред и не правильно. Класс - это тип. Тип - это определенный набор данных. Это значит что у каждого экземпляра класса одинаковый набор данных.
Ок, педант, признаю, я неправильно выразился. Вот так тебя устроит?
"нескольких объектов одного класса, но с разными __значениями__ свойств"

> Это не бонус для искателей смысла, а еще один антипатерн - как не надо делать контроллер.
> В этом бреде даже разбираться не стоит.
Радость моя, где ты там увидел паттерн? Это контроллер довольно таки немаленькой формы. Закодировано в полном соответсвии с идеологией фрэймворка. Не сомневаюсь в том, что всегда будут существовать головы с закостеневшими мозгами, которые просто заспиртованы в идеологии вэба и неспособны воспринимать альтернативные идеологии создания приложений.

whirlwind, можешь успокоиться уже. Ответ на вопрос поставленный в первом топике я нашел и привел.
Всем спасибо.
 

whirlwind

TDD infected, paranoid
>где ты там увидел паттерн? Это контроллер
>Закодировано в полном соответсвии с идеологией фрэймворка

no comments, моя радость

PS. А вот это так и просится на агиташку

Не сомневаюсь в том, что всегда будут существовать головы с закостеневшими мозгами, которые просто заспиртованы в идеологии вэба и неспособны воспринимать альтернативные идеологии создания приложений.
В политике себя не пробовали?
 
Сверху