Autor | Zpráva | ||
---|---|---|---|
TFSi Profil |
#1 · Zasláno: 6. 1. 2009, 09:40:50 · Upravil/a: TFSi
Zdravím,
omlouvám se za blbý titulek, ale lepší mně nenapadl :/ Mám tyto soubory: index.php <?php require_once 'class.Main.php'; $app = new Main; class.Main.php <?php class Main { public $trida; public static $http = Array(); function __construct() { require_once 'class.Trida.php'; $this->trida = new Trida; } /* zbytek kódu */ } a class.Trida.php <?php class Trida { public function Trida() { /*1)*/ Main::$http[] = 'obsah'; // skončí na Fatal error (viz níž) /*2)*/ global $app; $app->http[] = 'obsah'; // tak tahle šaškárna projde...?! } } a pokud se to takhle pokusím spustit, tak se mi to zacyklí :( . Pokud ale třída Trida nebude mít extends Main, tak to poběží tak jak má, jenomže z ní nebudu moc pořádně zasahovat do proměnných v třídě Main. Poradíte někdo? |
||
bohyn Profil |
#2 · Zasláno: 6. 1. 2009, 09:50:20
TFSi
„a pokud se to takhle pokusím spustit, tak se mi to zacyklí :( . Pokud ale třída Trida nebude mít extends Main, tak to poběží tak jak má, jenomže z ní nebudu moc pořádně zasahovat do proměnných v třídě Main.“ Tohle reseni je pekna blbost. Z Tridy muzes normalne pristupovat k promenym v Main (pokud je to treba), takze zadny takovy hybrid neni treba. |
||
TFSi Profil |
#3 · Zasláno: 6. 1. 2009, 10:20:48 · Upravil/a: TFSi
bohyn
„Z Tridy muzes normalne pristupovat k promenym v Main (pokud je to treba), takze zadny takovy hybrid neni treba.“ :: jsem zkoušel, ale i když mám proměnou nastavenou na public static, tak skončím na Fatal error: Access to undeclared static property: Main::$http in ... (upravil jsem příklad nahoře aby to bylo vidět) Zatím jsem to řešil prasárnou typu global $app; $app->http = ... , jenže takovouhle šaškárnu snad ani nemůžu vypustit do ostrého provozu ;) Btw, ještě mně napadlo: nemůže třeba název třídy Main kolidovat s něčím ve vnitřnostech PHP? |
||
Aesir Profil |
#4 · Zasláno: 6. 1. 2009, 10:41:04 · Upravil/a: Aesir
TFSi:
1.) v třídě Trida dědíte i ten konstruktor, tak se nedivte, že se vám cyklí 2.) parent edit: aha, tak už nedědíte :)) |
||
TFSi Profil |
#5 · Zasláno: 6. 1. 2009, 10:48:20
Aesir
„aha, tak už nedědíte :))“ To je právě ono - když nedědím, tak se Main nedostanu, a když dědím, tak se to cyklí :( |
||
bohyn Profil |
#6 · Zasláno: 6. 1. 2009, 10:55:44
TFSi
Nejlepsi bude asi priklad class trida1 { public $var; function __construct() { $this->var = 1; } function getvar() { return $this->var; } } class trida2 extends trida1 { function __construct() { parent::__construct(); } function printvar() { echo $this->var; echo parent::getvar(); } } $trida = new trida2; $trida->printvar(); // 11 „Btw, ještě mně napadlo: nemůže třeba název třídy Main kolidovat s něčím ve vnitřnostech PHP?“ Jelikoz php funkci main() nema a ani neni rezervovane slovo tak by to kolidovat nemelo. |
||
TFSi Profil |
#7 · Zasláno: 7. 1. 2009, 15:40:07
bohyn
Jasně, chápu. Díky. Ale ještě se zeptám: jde to použít i v případě, že chci do (pokud to vztáhnu na tvůj příklad) třídy trida1 vložit třeba pět, šest tříd, které by měly "extends trida1"?? |
||
bohyn Profil |
#8 · Zasláno: 7. 1. 2009, 15:51:17
TFSi
Vkladani potomku do rodicovske tridy je logicka chyba, ale udelat by to slo. Pokud by se tridy vytvarely v konstruktotu trida1 tak by v tride2 bylo treba zabranit volani konstruktoru parent::_construct() (aby nedoslo k cykleni) a inicializovat vsechny promene v konstruktoru trida2 |
||
TFSi Profil |
#9 · Zasláno: 7. 1. 2009, 16:11:12
„Vkladani potomku do rodicovske tridy je logicka chyba“
Aha ... :| ... takže: se asi trošku změnilo téma: mám několik tříd a chci, aby se všechny nějak automaticky načetly. Tedy abych v index.php nemusel dělat něco jako <?php require_once 'trida1.php'; $trida1 = new trida1; require_once 'trida2.php'; $trida2 = new trida2; ... ale aby se to dalo udělat zavoláním jedné funkce / třídy / prostě nečeho? |
||
bohyn Profil |
#10 · Zasláno: 7. 1. 2009, 19:13:50 · Upravil/a: bohyn
TFSi
Reseni je nekolik: 1) sesypat tridy do jednoho souboru a instanci kazde tridy vytvorit v tom souboru. 2) vytvorit dalsi script ktery vlozi jednotlive tridy a vytvori instanci kazde z nich 3) udelat funkci ktera se potara o vlozeni a jejichvytvoreni a 3a) vysledek vrati jako pole 3b) promene definujes mimo funkci a funkce k nim pak pristupuje pres global // definice promenych $trida1 = $trida2 = null; function vytvor_tridy() { global $trida1, $trida2; // require ... $trida1 = new trida1; // atd. } Edit: 4) Vytvorit tridu ktera bude slouzit jako kontejner pro pozadovane tridy. |
||
Časová prodleva: 15 let
|
0