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]   

> Без описания
Tpyn666
Отправлено: 09 Мая, 2010 - 18:51:41
Post Id


Новичок


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


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




Народ нужен совет.
Есть задача реализовать коллекцию обьектов.
Задача в принципе из разряда CtrlL+C -> Ctrl+V. Но вот в чем вопрос как сделать так чтоб объекты и коллекция имели доступ к приватным методам и свойствам. Что-то вроде friend function в C++

PHP:
скопировать код в буфер обмена
  1.  
  2. class MyCollection implements Iterator{
  3.     private $field;
  4.    
  5.     public function  __construct() {
  6.        
  7.     }
  8.    
  9.     public function current ( ){
  10.         $cr = new myObject($this);
  11.     }
  12.     public function key ( ){}
  13.     public function next (){}
  14.     public function rewind (){}
  15.     public function valid ( ){}
  16. }
  17.  
  18. class myObject{
  19.    
  20.     private function  __construct(MyCollection $collection) {
  21.         $collection->field = 'access';
  22.     }
  23. }
  24.  
 
 Top
valenok Модератор
Отправлено: 09 Мая, 2010 - 21:31:28
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


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




Для этой операции $collection->field = 'access';
тебе придется в классе MyCollection написать метод,
который будет принимать новое значение и записывать его в переменную.


-----
Truly yours, Sasha.
 
My status
 Top
Tpyn666
Отправлено: 09 Мая, 2010 - 21:55:17
Post Id


Новичок


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


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




В том то дело что я не хочу такой вариант
PHP:
скопировать код в буфер обмена
  1. ...
  2. public function SetField($value){}
  3. ...


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

(Отредактировано автором: 09 Мая, 2010 - 21:55:44)

 
 Top
JustUserR
Отправлено: 10 Мая, 2010 - 01:41:36
Post Id



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


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


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




Tpyn666 Если бы класс MyObject наследовался от класса MyCollection то можно было бы использовать спецификатор доступа protected - потому что благодаря нему доступа снаружи не будет а контейнер и элемент смогут получать доступ к своим закрытым полям
Однако PHP имеет хорошие возможности по решению вашей задачи как есть - вы можете сделать функцию для установки значения со спецификатором public и далее уже внутри нее проверять давать ли соответсвующий доступ - это можно сделать с помощью функций http://php.su/functions/?is-a и http://php.su/functions/?is-subclass-of


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Tpyn666
Отправлено: 11 Мая, 2010 - 14:55:26
Post Id


Новичок


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


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




JustUserR спасибо за совет.
Но это не то что мне нужно. Эти два класса ни как не могут быть унаследованы друг от друга у них резаные задачи и они реализуют разные интерфейсы.
Я нашел решение не совсем корректное как мне кажется но оно работает.
Кому интересно вот решение Хорошо
PHP:
скопировать код в буфер обмена
  1. class MyCollection {
  2.     private $field;
  3.  
  4.     public function  __construct() {
  5.         $this->field = 'private';
  6.     }
  7.    
  8.     public function current ( ){
  9.         $cr = new myObject($this->field);
  10.         return $cr;
  11.     }
  12.  
  13.     public function GetField(){
  14.         return $this->field;
  15.     }
  16. }
  17.  
  18. class myObject{
  19.  
  20.     private $field;
  21.  
  22.     public function  __construct(&$field) {
  23.         $this->field = &$field;
  24.     }
  25.  
  26.     public function ToDo(){
  27.         $this->field = 'Good! access';
  28.     }
  29. }
  30.  
  31.  
  32. $col = new MyCollection();
  33. echo " Befor create new obj. Field: ".$col->GetField()."\n";
  34. $obj = $col->current();
  35. $obj->ToDo();
  36. echo " After obj->ToDo. Field: ".$col->GetField()."\n";

Через ссылки. Коллекция при создание объекта отдает ему указатели на свои приватные поля.
 
 Top
JustUserR
Отправлено: 12 Мая, 2010 - 09:52:00
Post Id



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


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


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




Tpyn666 пишет:
JustUserR спасибо за совет.
Но это не то что мне нужно. Эти два класса ни как не могут быть унаследованы друг от друга у них резаные задачи и они реализуют разные интерфейсы.
Я нашел решение не совсем корректное как мне кажется но оно работает.
Кому интересно вот решение
Пожалуйста! Насчет прямого наследования классов понятно - но может еще как вариант посмотреть классовые интерфейсы http://www.phpworld[dot]ru/php5/php5interface.php
Также если вам интересно то можете использовать специальные функции-обработчики _get и __set - в таком случае вы сможете обращаться к любым значения $obj->everything и обрабатывать далее установку и получение данных из них


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB