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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Последовательный вызов свойств класса

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Согласно массиву
qtk
Отправлено: 01 Июля, 2014 - 16:32:14
Post Id


Частый гость


Покинул форум
Сообщений всего: 198
Дата рег-ции: Май 2012  


Помог: 0 раз(а)




Подскажите пожалуйста как это реализовать?

К примеру есть класс:
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.  

Спасибо!
 
 Top
esterio
Отправлено: 01 Июля, 2014 - 16:40:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




key2 также должен быть обектом
либо курите SPL ArrayAccess
 
 Top
LIME
Отправлено: 01 Июля, 2014 - 19:18:47
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




__get
(Добавление)
esterio тут задача наоборот
 
 Top
OrmaJever Модератор
Отправлено: 01 Июля, 2014 - 19:55:57
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




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; // :)

(Добавление)
хотя наверное мой код уйдёт в рекурсию Улыбка Перегнул ))


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
qtk
Отправлено: 01 Июля, 2014 - 20:20:30
Post Id


Частый гость


Покинул форум
Сообщений всего: 198
Дата рег-ции: Май 2012  


Помог: 0 раз(а)




LIME пишет:
__get
, а по подробней можно?
(Добавление)
OrmaJever пишет:
хотя наверное мой код уйдёт в рекурсию

Вы совершенно правы)))
 
 Top
LIME
Отправлено: 01 Июля, 2014 - 21:13:57
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




OrmaJever А?!
qtk гуглить
(Добавление)
я с телефона
 
 Top
DelphinPRO
Отправлено: 01 Июля, 2014 - 21:43:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




$class->key2->key3

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

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

Если это все один и тот же класс, то можно воспользоваться магией (__get())


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
qtk
Отправлено: 01 Июля, 2014 - 21:46:49
Post Id


Частый гость


Покинул форум
Сообщений всего: 198
Дата рег-ции: Май 2012  


Помог: 0 раз(а)




DelphinPRO, будьте добры пример реализации
 
 Top
LIME
Отправлено: 01 Июля, 2014 - 21:48:16
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




DelphinPRO я тя щас ударю)
читай Ураганный огонь
 
 Top
teddy
Отправлено: 01 Июля, 2014 - 22:16:47
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Затея конечно УЖАСНАЯ, но реализацию покажу

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
 
 Top
LIME
Отправлено: 01 Июля, 2014 - 22:28:11
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




реализация не менее ужаснаУлыбка
DelphinPRO покажи я с телефона
 
 Top
OrmaJever Модератор
Отправлено: 01 Июля, 2014 - 22:40:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




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; // :)


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
teddy
Отправлено: 01 Июля, 2014 - 22:40:37
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




LIME пишет:
реализация не менее ужасна

Какая задача такая и реализация, предложи лучше. У меня вышло 2-мя строчками кода(см. конструктор, остальное это код ТС), покажи свой вариант
 
 Top
LIME
Отправлено: 01 Июля, 2014 - 22:41:03
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




тем более ограниченая вложеность
фи
(Добавление)
явыше паказывал
читай ектитьУлыбка
(Добавление)
конструкторы для таких вещей не пользуют
они для инициализаций всяческихУлыбка
хотя тыж все лучше знаешь
(Добавление)
хотя через __get неограниченную вложенность тоже не сделать
имхо нужен прототип
но нне напишуУлыбка
(Добавление)
хотя через __get неограниченную вложенность тоже не сделать
имхо нужен прототип
но нне напишуУлыбка
 
 Top
teddy
Отправлено: 01 Июля, 2014 - 23:47:03
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Я не пришел сюда обсуждать как делать лучше а просто дал ТС то что он хочет.

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

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

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

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

Мое имхо - забить на эту плохую идею, поэтому удаляюсь с топика.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB