PHP.SU

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


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

> Без описания
sKaa
Отправлено: 26 Ноября, 2011 - 17:19:06
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


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

[+]


Спойлер (Отобразить)

Итак : Как видно класс реализует 2 интерфейса ArrayAccess и Countable значит нам доступен такой синтаксис :
PHP:
скопировать код в буфер обмена
  1.  
  2. $Registry = new Registry;
  3. $Registry['test'] = 123;
  4. $Registry['test2'] = 321;
  5.  
  6. echo count($Registry); // Выведет 2
  7. echo $Registry->count; // Выведет 2  
  8.  
  9.  

Ну об этих интерфейсах уже давно всем всё известно. Внимание вопрос :
PHP:
скопировать код в буфер обмена
  1.  
  2. $Registry->qwe = 123;
  3. $Registry->test = 321;
  4. $Registry->Application = & new Application;
  5.  


Как посчитать объекты в такой реализации?
 
 Top
Мелкий Супермодератор
Отправлено: 26 Ноября, 2011 - 17:23:13
Post Id



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


Покинул форум
Сообщений всего: 11897
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




sKaa пишет:
Как посчитать объекты в такой реализации?

Реализовать __set и __get.


-----
PostgreSQL DBA
 
 Top
sKaa
Отправлено: 26 Ноября, 2011 - 17:25:04
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


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

[+]


Подробней пожалуйста Улыбка А лучше пример )
 
 Top
Stierus Супермодератор
Отправлено: 28 Ноября, 2011 - 08:56:52
Post Id



Рекордсмен по количеству сообщений за 7 дней


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


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




 
My status
 Top
morph-x
Отправлено: 28 Ноября, 2011 - 18:24:07
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Июнь 2011  


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




Методы __set и __get вызываются при попытке доступа к (несуществующему) полю объекта. Вот пример:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. class Registry implements ArrayAcces, Countable {
  4.     private $data = array();
  5.  
  6.     ...
  7.  
  8.     public function __set($name, $value) {
  9.         $this->data[$name] = $value;
  10.     }
  11.  
  12.     public function __get($name) {
  13.         return $this->data[$name];
  14.     }
  15.  
  16.     ...
  17.  
  18. }
  19.  
  20. ?>

Теперь при попытке записи/чтения какого-либо параметра в реестре управление будет передаваться методам __get или __set соответственно. А они уже будут работать с массивом $data.

(Отредактировано автором: 28 Ноября, 2011 - 18:30:30)

 
 Top
sKaa
Отправлено: 28 Ноября, 2011 - 18:38:47
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


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

[+]


Спасибо я уже разобрался. Дело в том, что если использовать магические __set и __get
не скалярные величины нельзя передать по ссылке
PHP:
скопировать код в буфер обмена
  1.  
  2. $Config['mysql_username'] = 'root';
  3. $Config['mysql_password'] = '123';
  4.  
  5. $Registry = new Registry;
  6. $Registry->Config = & $Config;
  7.  

Вызовет ошибку :
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Notice: Indirect modification of overloaded property Registry::$Config has no effect in C:\www\tm\Index.php on line 50 Fatal error: Cannot assign by reference to overloaded object in C:\www\tm\Index.php on line 50
  3.  


Решение тоже есть :
PHP:
скопировать код в буфер обмена
  1.  
  2. public function __set($key, $var){
  3.                 if(is_scalar($var))
  4.                         $this->data[$key] = & $var;
  5.                 else $this->data[$key] =  $var;
  6.                 }
  7.  


Но тут новая проблема :
PHP:
скопировать код в буфер обмена
  1.  
  2. $Registry = new Registry();
  3. $Registry->Page->Current = 3;
  4. $Registry->Page->Next = 4;
  5. $Registry->Page->Prev = 2;
  6.  

Каждая из строчек вызовет по ошибке. (кроме экземпляра класса)
 
 Top
morph-x
Отправлено: 28 Ноября, 2011 - 19:01:12
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Июнь 2011  


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




Может лучше тогда наследовать класс ArrayObject ? Так в ZF сделан класс Registry.
(Добавление)
Вот, привожу две цитаты с документации:

Цитата:
Вы можете также обращаться к элементам, сохраненным в реестре, как к элементам массива, поскольку класс реестра наследует от ArrayObject.

Но там дальше уже видно, что обращаться можно и как к элементам массива, и как к объектам.

Цитата:
Сохраняемое значение может быть объектом, массивом или скаляром.

Вроде, то что вам нужно, или нет?

(Отредактировано автором: 29 Ноября, 2011 - 01:15:47)

 
 Top
sKaa
Отправлено: 28 Ноября, 2011 - 19:16:34
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


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

[+]


Вроде да. Сейчас тогда скачаю Zend Framework. Погляжу как там дела с этим обстоят.
 
 Top
morph-x
Отправлено: 28 Ноября, 2011 - 19:26:49
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Июнь 2011  


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




Вот, нашел там библиотеку реестра в ZF (library/Zend/Registry.php):

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


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB