Передача объекта внутрь класса. РНР5
Итак. Есть два класса. Внутри одного из них нужно использовать экземпляр другого (пытался сделать так... естественно не работает:) ):
Код:
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();
{
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?
Код:
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);
{
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);
Передача параметров недопустима. Так действительно будет работать, но нужно реализовать без передачи параметров в методы. :(
Сделай тогда во втором классе референс на экземпляр объекта первого... как присвоить этот референс тебе виднее
Ну по сути есть некий стержневой объект, доступ к которому должны иметь все остальные объекты. Можно провести аналогию с объектом, работающим с БД. К нему должны иметь доступ все объекты, которым нужна информация из базы данных. Вот как это лучше реализовать?
А чем, собственно, путь с использованием методов и передачей через них референсов не угодил?
Уточни о чем ты ведешь речь - две недели без выходных - мозг уже не работает. :(
К тому же стержневой класс частенько используется в конструкторах. Как быть там?
Но в любом случае, передача референса через интерфейс куда более грамотный подход, чем использование global
Код:
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>';
{
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 = new A;
$b = $a;
$c = new A;
Как можно определить что $a и $b ссылаются на одно и то же, а $c на другой экземпляр того же класса?
И ещё, я видел сие слегка иначе:
Код:
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
{
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 поместить все необходимые переменные и методы, которые нужны, например, для коннекта с базой. Это будет нечто единое для всех, причём у каждого отдельного класса будет интерфейс к этому в виде внутренего референса.
Я понимаю, что это несколько не то, что вы хотели увидеть, здесь я просто поделился мыслями по повду использования референсов