Autor | Zpráva | ||
---|---|---|---|
gaminn Profil * |
#1 · Zasláno: 21. 7. 2006, 18:34:33
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 |
#2 · Zasláno: 21. 7. 2006, 18:55:00
No, já to teda nechápu. Šlo by ukázat celistvou a aspoň trochu realistickou ukázku kódu?
|
||
gaminn Profil * |
#3 · Zasláno: 21. 7. 2006, 19:05:00
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 |
#4 · Zasláno: 21. 7. 2006, 19:08:23
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 * |
#5 · Zasláno: 21. 7. 2006, 19:54:28
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 |
#6 · Zasláno: 23. 7. 2006, 21:28:23
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í:
|
||
WanTo Profil |
#7 · Zasláno: 23. 7. 2006, 21:31:49
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 |
#8 · Zasláno: 24. 7. 2006, 01:19:53
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 |
#9 · Zasláno: 24. 7. 2006, 13:17:48
používám global ve funkci a funguje to, ale jak je to správné to nevím
function neco () { global $settings; $settings->neco(); . . . . |
||
Časová prodleva: 18 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0