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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
DlTA
Отправлено: 12 Мая, 2015 - 11:07:57
Post Id



Постоянный участник


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


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




я в поисках красивого решения

мне нужно чета типа внутреннего кеша в объекте класса

нынче выглядит примерно так:
PHP:
скопировать код в буфер обмена
  1. function ... ()
  2. {
  3.   if (is_null($this->item)) $this->item = new ClassSubItem($this);
  4.   return $this->item;
  5. }

но писать такое очень леньки
хотелось бы инкапсулировать проверку и подавать на вход только метод получения значения, а уже там внутри пусть само вроверяет наличие значения и необходимость расчета нового значения

есть мысли как оформить такой вызов?
 
 Top
DelphinPRO
Отправлено: 12 Мая, 2015 - 15:16:46
Post Id



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


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


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




через магию __get ?


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
DlTA
Отправлено: 12 Мая, 2015 - 15:38:20
Post Id



Постоянный участник


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


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




DelphinPRO пишет:
через магию __get ?
иначе говоря заюзать шаблон прокси
PHP:
скопировать код в буфер обмена
  1. class ClassItem{
  2.   pablic function do(){}
  3. }
  4.  
  5. Class ClassProxyItem{
  6.   public function __construct(ClassItem $oItem){}
  7.  
  8.   public function __call ( string $name , array $arguments )
  9.     // проверяем наличие значения по параметрам и возвращаем
  10.   }
  11. }


можно было бы такое замутить, но переписывать дофига, и не знаю зачем, но вдруг в каком то из методов исходного класса понадобится получать кешированное значение
 
 Top
MAXUS
Отправлено: 13 Мая, 2015 - 08:18:13
Post Id


Посетитель


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


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




DlTA пишет:
DelphinPRO пишет:
через магию __get ?
иначе говоря заюзать шаблон прокси

можно было бы такое замутить, но переписывать дофига, и не знаю зачем, но вдруг в каком то из методов исходного класса понадобится получать кешированное значение


Иначе говоря шаблон registry. Но перед этим определиться зачем...


(Добавление)
DelphinPRO пишет:
через магию __get ?


Тока учесть, что __get вызывается при обращении к недоступным свойствам. Т.е. если какое-то свойство определить, то он уже не сработает.

(Отредактировано автором: 13 Мая, 2015 - 08:35:47)

 
 Top
Sail
Отправлено: 13 Мая, 2015 - 12:44:41
Post Id



Участник


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


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




MAXUS, определённость тут ни при чём. Играет роль именно доступность.
DlTA, вот некоторые вариации на тему:
Спойлер (Отобразить)

Ну и про шаблоны - тоже есть над чем поразмыслить: привет из 2013-го.
 
 Top
MAXUS
Отправлено: 13 Мая, 2015 - 14:11:05
Post Id


Посетитель


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


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




Sail пишет:
MAXUS, определённость тут ни при чём. Играет роль именно доступность.


Как сказать...

PHP:
скопировать код в буфер обмена
  1. class foo{
  2.         public function __get($name){
  3.                 return 'undefined';
  4.         }
  5. }
  6. $foo = new foo();
  7. echo $foo->bar.'<br />'; //выведет undefined
  8. $foo->bar='defined';
  9. echo $foo->bar.'<br />'; //выведет defined


А по поводу шаблонов... Это как в литературе, музыке и кино. Нет чистых жанров. Есть жанровые признаки. Чистый жанр бывает только в начале его образования, а далее как правило идет смешение в зависимости от творческой задачи. С шаблонами, кмк, точно также.

(Отредактировано автором: 13 Мая, 2015 - 14:30:14)

 
 Top
Sail
Отправлено: 13 Мая, 2015 - 14:52:40
Post Id



Участник


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


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




MAXUS пишет:
Как сказать...
, а теперь разбавьте код вкраплением
после echo в 7 и 9-й строчках Улыбка
(Добавление)
В первом случае - не определена и, следовательно, не доступна; во втором - определена и доступна (поскольку public).
 
 Top
MAXUS
Отправлено: 13 Мая, 2015 - 15:14:58
Post Id


Посетитель


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


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




Sail пишет:
В первом случае - не определена и, следовательно, не доступна; во втором - определена и доступна (поскольку public).


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

ЗЫ
Sail пишет: после echo в 7 и 9-й строчках Улыбка


Ну и ты вот скажи, удобно читать вывод var_dump без тэга <pre>? Я может чего не понимаю, вполне допускаю это, но в данном случае идет вывод string и особой роли не играет. А меня лично напрягает постоянно в примерах дописывать <pre> и </pre>... А по иному читать вывод не удобно. В данном случае скопипастил код, запустил и все понял без дополнительных изощрений. Или я не прав?

(Отредактировано автором: 13 Мая, 2015 - 15:20:59)

 
 Top
Sail
Отправлено: 13 Мая, 2015 - 15:25:29
Post Id



Участник


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


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




MAXUS, для ясности:
PHP:
скопировать код в буфер обмена
  1. /**
  2.  * @propery string $bar
  3.  */
  4. class foo{
  5.    
  6.     private $bar;
  7.    
  8.     public function __set($name, $value) {
  9.         if($name === 'bar') {
  10.             $this->bar = $value;
  11.         } else {
  12.             exit("'{$name}' - не наше свойство!");
  13.         }
  14.     }
  15.     public function __get($name){
  16.         return 'undefined';
  17.     }
  18. }
  19. $foo = new foo();
  20. echo $foo->bar.'<br />';
  21. $foo->bar='defined';
  22. echo $foo->bar.'<br />';

В обоих случаях свойство недоступно и вызывается __get().
 
 Top
MAXUS
Отправлено: 13 Мая, 2015 - 15:27:27
Post Id


Посетитель


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


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




Sail пишет:
MAXUS, для ясности:


Мне это и так ясноУлыбка См. выше.
 
 Top
Sail
Отправлено: 13 Мая, 2015 - 16:53:16
Post Id



Участник


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


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




MAXUS пишет:
Ну и ты вот скажи, удобно читать вывод var_dump без тэга <pre>?

Мне xdebug способствует в плане удобочитаемости Улыбка
Ну и всё-таки ещё разок про определённость и доступность... Закатив глазки
Спойлер (Отобразить)
 
 Top
MAXUS
Отправлено: 13 Мая, 2015 - 20:04:07
Post Id


Посетитель


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


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




Sail пишет:
Ну и всё-таки ещё разок про определённость и доступность...


Да я ведь и не спорю. Просто речь была о кэше и о предложении реализовать его через __get(). Я просто отметил, что эту особенность надо учитывать. А так, кмк, это типичный реестр с некоторыми нюансами.
 
 Top
DeepVarvar Супермодератор
Отправлено: 13 Мая, 2015 - 20:48:14
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




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


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB