Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Последовательный вызов свойств класса
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Последовательный вызов свойств класса

Страниц (2): [1] 2 »
 

1. qtk - 01 Июля, 2014 - 16:32:14 - перейти к сообщению
Подскажите пожалуйста как это реализовать?

К примеру есть класс:
PHP:
скопировать код в буфер обмена
  1.  
  2. class MyClass
  3. {
  4.     public $var = ['key1' => 'val1', 'key2' => ['key3' => 'val3','key4' => 'val4']];
  5. }
  6.  

Как создать свойства класса согласна ключам массива, что бы иметь к ним доступ в таком виде:
PHP:
скопировать код в буфер обмена
  1.  
  2. $class = new MyClass();
  3. echo $class->key1;  //Выводит val1
  4. echo $class->key2->key3;  //Выводит val3
  5.  

Спасибо!
2. esterio - 01 Июля, 2014 - 16:40:29 - перейти к сообщению
key2 также должен быть обектом
либо курите SPL ArrayAccess
3. LIME - 01 Июля, 2014 - 19:18:47 - перейти к сообщению
__get
(Добавление)
esterio тут задача наоборот
4. OrmaJever - 01 Июля, 2014 - 19:55:57 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. class MyClass
  2. {
  3.     public $var;
  4.     public $val = 5;
  5.  
  6.     public function __construct() {
  7.         $this->var = new MyClass();
  8.     }
  9. }
  10.  
  11. $class = new MyClass();
  12. $class->var->val;
  13. $class->var->var->var->val; // :)

(Добавление)
хотя наверное мой код уйдёт в рекурсию Улыбка Перегнул ))
5. qtk - 01 Июля, 2014 - 20:20:30 - перейти к сообщению
LIME пишет:
__get
, а по подробней можно?
(Добавление)
OrmaJever пишет:
хотя наверное мой код уйдёт в рекурсию

Вы совершенно правы)))
6. LIME - 01 Июля, 2014 - 21:13:57 - перейти к сообщению
OrmaJever А?!
qtk гуглить
(Добавление)
я с телефона
7. DelphinPRO - 01 Июля, 2014 - 21:43:59 - перейти к сообщению
$class->key2->key3

свойство key2 должно быть объектом, содержащим свойство key3

о создании объектов вы должны позаботиться сами

Если это все один и тот же класс, то можно воспользоваться магией (__get())
8. qtk - 01 Июля, 2014 - 21:46:49 - перейти к сообщению
DelphinPRO, будьте добры пример реализации
9. LIME - 01 Июля, 2014 - 21:48:16 - перейти к сообщению
DelphinPRO я тя щас ударю)
читай Ураганный огонь
10. teddy - 01 Июля, 2014 - 22:16:47 - перейти к сообщению
Затея конечно УЖАСНАЯ, но реализацию покажу

PHP:
скопировать код в буфер обмена
  1. class MyClass
  2. {
  3.     public $var = ['key1' => 'val1', 'key2' => ['key3' => 'val3','key4' => 'val4']];
  4.        
  5.     public function __construct()
  6.     {
  7.         foreach($this->var as $key=>$val)
  8.         {
  9.                 $this->$key = is_array($val) ? (object)$val : $val;
  10.         }
  11.     }
  12. }
  13.  
  14. $class = new MyClass();
  15. echo $class->key1;  //Выводит val1
  16. echo $class->key2->key3;  //Выводит val3
11. LIME - 01 Июля, 2014 - 22:28:11 - перейти к сообщению
реализация не менее ужаснаУлыбка
DelphinPRO покажи я с телефона
12. OrmaJever - 01 Июля, 2014 - 22:40:02 - перейти к сообщению
DelphinPRO пишет:
можно воспользоваться магией

давайте только без магии, меня за это из Хогвартса выперли Хм
PHP:
скопировать код в буфер обмена
  1. class MyClass
  2. {
  3.     public $val = 5;
  4.  
  5.     public function __get( $name ) {
  6.         return new MyClass();
  7.     }
  8. }
  9.  
  10. $class = new MyClass();
  11. echo $class->var->val;
  12. echo $class->var->var->var->val; // :)
13. teddy - 01 Июля, 2014 - 22:40:37 - перейти к сообщению
LIME пишет:
реализация не менее ужасна

Какая задача такая и реализация, предложи лучше. У меня вышло 2-мя строчками кода(см. конструктор, остальное это код ТС), покажи свой вариант
14. LIME - 01 Июля, 2014 - 22:41:03 - перейти к сообщению
тем более ограниченая вложеность
фи
(Добавление)
явыше паказывал
читай ектитьУлыбка
(Добавление)
конструкторы для таких вещей не пользуют
они для инициализаций всяческихУлыбка
хотя тыж все лучше знаешь
(Добавление)
хотя через __get неограниченную вложенность тоже не сделать
имхо нужен прототип
но нне напишуУлыбка
(Добавление)
хотя через __get неограниченную вложенность тоже не сделать
имхо нужен прототип
но нне напишуУлыбка
15. teddy - 01 Июля, 2014 - 23:47:03 - перейти к сообщению
Я не пришел сюда обсуждать как делать лучше а просто дал ТС то что он хочет.

По поводу ограниченности - я лишь написал реализацию в контексте текущего примера, я не вижу требований по неограниченной вложенности от ТС.

LIME пишет:
они для инициализаций всяческих

Я в курсе, по сути инициализация (и создание, конечно же) в примере присутствовало.

LIME пишет:
имхо нужен прототип

Мое имхо - забить на эту плохую идею, поэтому удаляюсь с топика.

 

Powered by ExBB FM 1.0 RC1