Autor Zpráva
enoice
Profil
Ahoj,

rozhodl jsem se, že si v php napíšu takové pomůcky pro webdesign, například práci s databází nebo obrázky tak jak mi vyhovuje. Filozofie byla taková, že by byla hlavní třída, která by obsahovala objekty, které by byly instancemi dalších tříd (database, image, file,...) což by problém nebyl...

problém přichází, pokud bych chtěl například z třídy image používat metody třídy file.

OK, bavil jsem se o tom s kamarádem, ten říkal, že si mám pro každou třídu vytvořit vlastní instanci používající třídy, což mi nepřijde příliš estetické řešení, když už mám instanci v hlavní třídě, proč bych jí měl načítat znova do vnořené třídy?

class hlavni {
...
$database = new database();
$file = new file();
$image = new image();
...
}
class database {
...
}
class file {
...
function delete($path) {...}
...
}
class image {
...
($parent)->file->delete("soubor.jpg");
...
}
-------

($parent) - tohle by měl bejt nějakej odkaz na rodiče instance této třídy... Dělal jsem ve Flashi, tam tohle bylo normální, v php mi to chybí.

Jestli někdo pochopíte můj problém a poradíte, budu vděčný ;)

Mějte se
YoSarin
Profil
parent::$file->delete();
enoice
Profil
ještě mě napadlo, že bych mohl do konstruktoru každé vnořené třídy dát třeba proměnnou $root, do které by se z hlavní třídy napsalo $this
------------------------------------------------
class database {
function database($root) {
$root->file->delete("soubor.jpg");
}
}

class hlavni {
...
$file = new file();
$database = new database($this);
}
----------------------------------------------

ale nepřijde mi to jako nejkrásnější řešení... takže stáhle hledám další návrhy
enoice
Profil
YoSarin: si odpověděl dřív než jsem to odeslal... díky, ale myslím odpovídáš na trochu něco jiného než mám na mysli... Kdybych používal extends tak to asi bude fungovat, ale já bych raději přes instance.

Zkus tohle...
----------------------------------------------------
<?php
class class2 {
function class2() {
$this->pozdrav = "cau";
}
}
class class3 {
function class3() {
$this->pozdrav = "ahoj";
echo(parent::$class2->pozdrav);
}
}
class class1 {
function class1 () {
$class2 = new class2();
$class3 = new class3();
}
}
$class1 = new class1();
?>
--------------------------------------
Mastodont
Profil
ilozofie byla taková, že by byla hlavní třída, která by obsahovala objekty, které by byly instancemi dalších tříd (database, image, file,...)

To je dost netradiční, obvykle se používá factory nebo registry, zkus si najít příklady na tyto návrhové vzory.
enoice
Profil
o tom jsem ještě neslyšel :)
K.
Profil *
UTFG:

http://objekty.vse.cz/Objekty/Vzory-uvod
MzM
Profil
no, moc tomu dotazu nerozumím (ale čemu já tady rozumím...), ale pokud máš ve třídě hlavni (nahoře) hotový objekt $file, tak se dá jednoduše zavolat jeho metoda $file->delete('cosi.jpg'); (aha, to není ten správný případ) , takže asi dál...

Pak, přesto, že nemáš instanci třídy můžeš použít statické metody, každé třídy. Tedy pokud je metoda delete() třídy file napsaná jako statická (nepoužívá proměnné třídy, jinak v php4 jsou všechny metody statické), tak můžeš použít

file::delete('cosi.jpg');

aniž vytváříš instanci třídy file.

toto je to, co chceš?
enoice
Profil
no, statické metody by mi asi nevyhovovaly...

znáte Texy!? (http://texy.info)

díval jsem se jak tenhle problém řeší -dgx- (podle mně zkušený php programátor) a ten ke každé vložené třídě dává parametr $this... čili způsob jaký jsem napsal dříve...

čili tento...

------------------------------------------------ 

class database {
function database($root) {
$root->file->delete("soubor.jpg");
}
}

class hlavni {
...
$file = new file();
$database = new database($this);
}
----------------------------------------------


takže to vidim asi na tenhle způsob
zero0x
Profil
ten isty problem som mal

hlavna trieda, a ta ma ako vlastnosti instancie ostatnych tried

(btw to som vymyslel sam)

class Core {

public $db;
public $user;

function __construct(){
$this->db = new Db($this);
$this->user = new User($this);
}

}

// ostatne triedy budu definovane tymto vzorcom

class Db {
private $core;

function __construct(&$core){
$this->core = $core;

// pokracujeme
}
}


mna teraz trapi skor taka vec, ze potrebujem natahovat tieto triedy viac dynamicky

teda podla potreby natiahnut nove a nove, a nechcem mat definovane tie premenne pre vsetky subtriedy. Teda aj pre tie, ktore mozno nenatiahnem.. ale to je uz na novy topic
enoice
Profil
ano... vyřešil jsi to stejným způsobem ;)

ten dalsi problem, nevim jak to myslis :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: