| 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: 18 let
|
|||
0