Autor Zpráva
gaminn
Profil *
Zdravím, snažím se tvořit něco v OOP a mám dotaz:

Moje stránka je tvořena strukturou tříd, na začátku je jedna třída, pomocí které vytvořím celý web, potom třeba třída settings pro nastavení jako je jazyk, časová zóna apod., třída pro obsluhu formulářů atd. a potom třída, která se nahrává podle toho, na jaké stránce zrovna jsem.

ve schématu a od začátku např.

$base=new base();

nyní je uvnitř třídy base kontruktor:

function __construct() {
$settings = new settings(); // ve třídě settings je dále kontruktor, který provede nastavení a několik vlastností, které poté obsahují aktuální nastavení

$class = new actualClass(); // třída, která je pro každou stránku jiná a obsahuje procedury, které jsou na dané stránce aktuální - např. jsem na stránce, kde je registrační formulář, takže třída module obsahuje metody jako loadForm, checkForm atd... Nyní jsem už ale uvnitř jiné třídy, ale i zde potřebuji přistupovat k vlastnostem a metodám objektu $settings... to je právě moje otázka - jak je tam dostat??

}


Samozřejmě by bylo možné předávat všechny potřebné objekty jako parametr, což je ale při více objektech, popř. aktualizacím a nových třídách nemožné.

Napadlo mě použít dědičnost:


class settings
{}


class base
{
private $classSettings;

function __construct()
{
$this->classSettings = new settings();
}
}

class actualClass extends base
{
function xxx()
{
echo $this->classSettings->jakakolivVlastnostNeboMetoda; // zde už objekt $settings vidím
}
}

Doufám, že se to bude chtít někomu číst a hlavně, že to pochopí;)

Ptám se tedy - jaké řešení je nejvhodnější, co se používá?
thingwath
Profil
No, já to teda nechápu. Šlo by ukázat celistvou a aspoň trochu realistickou ukázku kódu?
gaminn
Profil *
Já si to myslel;)

definice tříd:

class base
{
function __construct()
{
$settings=new settings();
$actualClass=new actualClass();
}
}

class settings
{
function __construct()
{
// nastavíme jazyk, čas, apod.
}
}

class actualClass
{
// je jedno, co zde je, můj problém je ten, že i v této třídě (a dalších jiných) chci mít k dispozici objekt $settings, který jsem inicioval ve třídě base, nechci ale předávat objekt $settings (a další objekty, se kterými potřebuju manipulovat po celém webu) každé jednotlivé metodě jako parametr
}

$base=new base(); // nyní se začne provádět vše, co je v definicích tříd


Snad už to je pochopitelné, záleží mi tedy na tom, jak v jiných třídách, než base (a vlastně i v samotné třídě base, pokud budu volat další její metodu) mít dostupný objekt $settings založený konstruktorem třídy base. Napadla mě tedy dědičnost popsaná výše.
thingwath
Profil
No, taková členská proměnná by toho asi dost spravila, pokud se nepletu :-)

class Base {
protected $settings;

function __construct () {
$this->settings = new Settings ();
}
}

Syntaxi už si dávno nepamatuju, tohle je odhad.
gaminn
Profil *
JJ, tohle přesně jsem zamýšlel výše, pro přístup k vlastnosti settings v jiných třídách bych pak používal dědičnost.

class dalsi extends base
{
function a()
{
echo $this->settings->vlastnost;
}
}

Ptám se jen proto, zda není lepší používat jiné řešení.
Honza Široký
Profil
Já bych to udělal takhle (v PHP už nedělám, takže přesně neznám syntaxi). Sice se bude muset předávat jeden paramter, ale to myslim ničemu nevadí:

class base
{
public $settings;
public $actualClass;

function __construct ()
{
$this->settings = new settings (this);
$this->actualClass =new actualClass(this);
}
}

abstract class subClass {
public $parent;

function __construct ($parent)
{
$this->parent =$parent;
}
}

class settings extends subClass
{
function __construct($parent)
{
parent::__construct ($parent); //tedka nevim jak presne se dedi konstruktor
// nastavíme jazyk, čas, apod.
}
}

class actualClass extends subClass
{
function __construct($parent)
{
parent::__construct ($parent);

echo $this->parent->settings->jakakoli_clenska_promenna_tridy_settings;
// todle lze pouzit u i vetsiho zanoreni (treba $this->parent->parent->settings->time->actualTime)
}
}
WanTo
Profil
Potřebujete v actualClass přistupovat k settings? Nebo o co vám jde?

Pokud ano, tak prostě do actualClass přidejte referenci na settings a nastavte ji v konstuktoru:

$class = actualClass($settings);
rabbit
Profil
gaminne, potřeba přístupu k atributu (datům) jako jediný důvod pro použití dědičnosti tříd mi připadá jako základní nepochopení principů OOP. Jak píše WanTo, v tom případě použij referenci, global, cokoliv. Pokud třída není z hlediska systémového návrhu/logiky dítětem jiné třídy, není důvod ji tvořit.
matak
Profil
používám global ve funkci a funguje to, ale jak je to správné to nevím

function neco () {
global $settings;

$settings->neco();
.
.
.
.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0