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 » PHP » Программирование на PHP » Скрыть взаимодействие классов

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

1. Tpyn666 - 09 Мая, 2010 - 18:51:41 - перейти к сообщению
Народ нужен совет.
Есть задача реализовать коллекцию обьектов.
Задача в принципе из разряда 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.  
2. valenok - 09 Мая, 2010 - 21:31:28 - перейти к сообщению
Для этой операции $collection->field = 'access';
тебе придется в классе MyCollection написать метод,
который будет принимать новое значение и записывать его в переменную.
3. Tpyn666 - 09 Мая, 2010 - 21:55:17 - перейти к сообщению
В том то дело что я не хочу такой вариант
PHP:
скопировать код в буфер обмена
  1. ...
  2. public function SetField($value){}
  3. ...


Так все смогу использовать это метод. Мне нужно что был такой механизм для взаимодействие двух классов и ограничь доступ для других к этим методам.
4. JustUserR - 10 Мая, 2010 - 01:41:36 - перейти к сообщению
Tpyn666 Если бы класс MyObject наследовался от класса MyCollection то можно было бы использовать спецификатор доступа protected - потому что благодаря нему доступа снаружи не будет а контейнер и элемент смогут получать доступ к своим закрытым полям
Однако PHP имеет хорошие возможности по решению вашей задачи как есть - вы можете сделать функцию для установки значения со спецификатором public и далее уже внутри нее проверять давать ли соответсвующий доступ - это можно сделать с помощью функций http://php.su/functions/?is-a и http://php.su/functions/?is-subclass-of
5. Tpyn666 - 11 Мая, 2010 - 14:55:26 - перейти к сообщению
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";

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

 

Powered by ExBB FM 1.0 RC1