Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Передача объекта внутрь класса. РНР5

13
29 августа 2006 года
RussianSpy
3.0K / / 04.07.2006
2 недели работы без выходных дают о себе знать - напал жестокий тупняк.
Итак. Есть два класса. Внутри одного из них нужно использовать экземпляр другого (пытался сделать так... естественно не работает:) ):
Код:
class InternalSysParams
{
   public $option1;
   public $option2;
   .....
}

class Page
{
   public $PageOption;
   
   public function InitPage()
   {
       /*Здесь идет обращение к объекту первого класса*/
       global $SysOptions;
       if($SysOptions->option1 && $SysOptions->option2) $this->PageOption=true;
       else $this->PageOption=false;
    }
    .......
}

$SysOptions = new InternalSysParams;
$PageObj = new Page;
$PageObj->InitPage();


Как добиться того чтобы в объекте $PageObj был доступен объект $SysOptions?
285
29 августа 2006 года
Romik
479 / / 24.11.2002
Код:
class InternalSysParams
{
   public $option1;
   public $option2;
   .....
}

class Page
{
   public $PageOption;
   // look at here -------------------------------------т
   public function InitPage(InternalSysParams &SysOptions)
   {
       /*Здесь идет обращение к объекту первого класса*/
//       global $SysOptions;
       if($SysOptions->option1 && $SysOptions->option2) $this->PageOption=true;
       else $this->PageOption=false;
    }
    .......
}

$SysOptions = new InternalSysParams;
$PageObj = new Page;
$PageObj->InitPage($SysOptions);
13
29 августа 2006 года
RussianSpy
3.0K / / 04.07.2006
Передача параметров недопустима. Так действительно будет работать, но нужно реализовать без передачи параметров в методы. :(
285
29 августа 2006 года
Romik
479 / / 24.11.2002
Сделай тогда во втором классе референс на экземпляр объекта первого... как присвоить этот референс тебе виднее
13
29 августа 2006 года
RussianSpy
3.0K / / 04.07.2006
Ну по сути есть некий стержневой объект, доступ к которому должны иметь все остальные объекты. Можно провести аналогию с объектом, работающим с БД. К нему должны иметь доступ все объекты, которым нужна информация из базы данных. Вот как это лучше реализовать?
285
29 августа 2006 года
Romik
479 / / 24.11.2002
А чем, собственно, путь с использованием методов и передачей через них референсов не угодил?
13
29 августа 2006 года
RussianSpy
3.0K / / 04.07.2006
Извини за тупизм (стыдно ужасно...)
Уточни о чем ты ведешь речь - две недели без выходных - мозг уже не работает. :(
13
29 августа 2006 года
RussianSpy
3.0K / / 04.07.2006
Если ты имеешь ввиду тупо передавать стержневой класс в методы в виде аргумента, то ИМХО это не очень правильно... ИМХО это не способ программирования с использованием ООП... Наверняка должен быть "правильный" способ... Или я ошибаюсь?
К тому же стержневой класс частенько используется в конструкторах. Как быть там?
285
29 августа 2006 года
Romik
479 / / 24.11.2002
Сэр, это не тупая передача (копирование) объекта "стержневого" класса, вы передаёте ссылку, что есть гуд. Что в этом кривого(не очень правильного)? я считаю это весьма правильный подход, другое дело, что задача может быть неверно сформулирована. Вероятно нужно вообще иначе действовать. Приведите пример того, как вы собираетесь эту схему использовать.
Но в любом случае, передача референса через интерфейс куда более грамотный подход, чем использование global
13
29 августа 2006 года
RussianSpy
3.0K / / 04.07.2006
Понял о чем вы. В связи с этим написал микро скриптик, который убедил меня окончательно в вашей правоте... На всякий случай вот:
Код:
class A
{
   public $x;
   public function inc_x()
   {
      $this->x->y++;
   }
}
class B
{
   public $y = 1;
}

$a = new A;
$b = new B;

$a->x = $b;
$a->inc_x();
echo $b->y.'<br>';
$a->inc_x();
echo $b->y.'<br>';
$a->inc_x();
echo $b->y.'<br>';

В связи с этим у меня есть последний вопрос: как известно оператор = при работе с классами не копирует объект, а лишь создает ссылку на него. Для копирования объектов используется функция clone.
Существует ли возможность определить ссылаются ли переменные на один объект или на разные? При условии что базовые классы у них одинаковые. Т.е.:
 
Код:
class A { .... }
$a = new A;
$b = $a;
$c = new A;

Как можно определить что $a и $b ссылаются на одно и то же, а $c на другой экземпляр того же класса?
285
29 августа 2006 года
Romik
479 / / 24.11.2002
Используйте '===', сэр :)
И ещё, я видел сие слегка иначе:
Код:
class A
{
   public $y = 1;
   
}
class B
{
   
   private $obj;
   public function setInstance($arg)
   {
       if($arg instanceof A){
          $this->obj = $arg;
       }
   }
   public function inc_x()
   {
      $this->obj->y++;
   }
}

$a = new A();
$b = new B();

$b->setInstance($a)
$b->inc_x();
echo $b->y.'<br>'; // 2
$b->inc_x();
echo $a->y.'<br>'; // 3
$b->inc_x();
echo $b->y.'<br>'; // 4

однако если Вам нужно нечто иное, то можно и clone юзать, тогда результат будет другим, тут я не спорю. Основная идея в том, что бы в class A поместить все необходимые переменные и методы, которые нужны, например, для коннекта с базой. Это будет нечто единое для всех, причём у каждого отдельного класса будет интерфейс к этому в виде внутренего референса.
Я понимаю, что это несколько не то, что вы хотели увидеть, здесь я просто поделился мыслями по повду использования референсов
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог