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 » » Объектно-ориентированное программирование » вызов по необходимости

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

1. DlTA - 12 Мая, 2015 - 11:07:57 - перейти к сообщению
я в поисках красивого решения

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

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

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

есть мысли как оформить такой вызов?
2. DelphinPRO - 12 Мая, 2015 - 15:16:46 - перейти к сообщению
через магию __get ?
3. DlTA - 12 Мая, 2015 - 15:38:20 - перейти к сообщению
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. }


можно было бы такое замутить, но переписывать дофига, и не знаю зачем, но вдруг в каком то из методов исходного класса понадобится получать кешированное значение
4. MAXUS - 13 Мая, 2015 - 08:18:13 - перейти к сообщению
DlTA пишет:
DelphinPRO пишет:
через магию __get ?
иначе говоря заюзать шаблон прокси

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


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


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


Тока учесть, что __get вызывается при обращении к недоступным свойствам. Т.е. если какое-то свойство определить, то он уже не сработает.
5. Sail - 13 Мая, 2015 - 12:44:41 - перейти к сообщению
MAXUS, определённость тут ни при чём. Играет роль именно доступность.
DlTA, вот некоторые вариации на тему:
Спойлер (Отобразить)

Ну и про шаблоны - тоже есть над чем поразмыслить: привет из 2013-го.
6. MAXUS - 13 Мая, 2015 - 14:11:05 - перейти к сообщению
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


А по поводу шаблонов... Это как в литературе, музыке и кино. Нет чистых жанров. Есть жанровые признаки. Чистый жанр бывает только в начале его образования, а далее как правило идет смешение в зависимости от творческой задачи. С шаблонами, кмк, точно также.
7. Sail - 13 Мая, 2015 - 14:52:40 - перейти к сообщению
MAXUS пишет:
Как сказать...
, а теперь разбавьте код вкраплением
после echo в 7 и 9-й строчках Улыбка
(Добавление)
В первом случае - не определена и, следовательно, не доступна; во втором - определена и доступна (поскольку public).
8. MAXUS - 13 Мая, 2015 - 15:14:58 - перейти к сообщению
Sail пишет:
В первом случае - не определена и, следовательно, не доступна; во втором - определена и доступна (поскольку public).


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

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


Ну и ты вот скажи, удобно читать вывод var_dump без тэга <pre>? Я может чего не понимаю, вполне допускаю это, но в данном случае идет вывод string и особой роли не играет. А меня лично напрягает постоянно в примерах дописывать <pre> и </pre>... А по иному читать вывод не удобно. В данном случае скопипастил код, запустил и все понял без дополнительных изощрений. Или я не прав?
9. Sail - 13 Мая, 2015 - 15:25:29 - перейти к сообщению
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().
10. MAXUS - 13 Мая, 2015 - 15:27:27 - перейти к сообщению
Sail пишет:
MAXUS, для ясности:


Мне это и так ясноУлыбка См. выше.
11. Sail - 13 Мая, 2015 - 16:53:16 - перейти к сообщению
MAXUS пишет:
Ну и ты вот скажи, удобно читать вывод var_dump без тэга <pre>?

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


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

 

Powered by ExBB FM 1.0 RC1