Autor | Zpráva | ||
---|---|---|---|
naromax Profil |
#1 · Zasláno: 30. 6. 2012, 10:58:20
Dobrý den,
používám PHP 5.3 a mám následující problém. Mám definovanou třídu podle vzoru Singleton a vytvořenou její instanci. Potom mám další třídu, kde chci použít (např.) nějaké její metody. Jenomže stránka vrací chybu, že je proměnná, která instanci třídy uchovává, nedefinovaná. Zkoušel jsem instanci vytvořit v metodě druhé třídy, přičemž to již fungovalo, ale je to hrozně krkolomné, protože první třídu potřebuji využít ve velkém množství dalších tříd. Dědičnost taky vylučuji. Doufám, že jste mě pochopili. Předem děkuji za odpovědi. |
||
Someone Profil |
#2 · Zasláno: 30. 6. 2012, 11:02:55
Co toto?
$trida = new Neco(); $trida2 = new Neco2($trida); //------------------------------------ class Neco2 { private $trida; function __construct($trida) { $this->trida=$trida; } } |
||
naromax Profil |
#3 · Zasláno: 30. 6. 2012, 11:09:26
Someone:
Díky, ale to bohužel není to, co jsem hledal. Raději to ještě upřesním ukázkovým zdrojovým kódem. // Třída a class a { public function Anything() { return 3.14; } } $tridaA = new a(); // Vytvořím instanci třídy a // Třída b class b { public function Anything2() { $PI = $tridaA->Anything(); // a nějaké další příkazy } } Pozn.: Názvy metod a jejich funkčnost jsem zvolil úplně náhodně v příkladu nenesou žádnou roli. |
||
Mike8748 Profil |
#4 · Zasláno: 30. 6. 2012, 11:36:48
naromax:
a kde máš ten singleton? class A { private static $instance; public static function getInstance() { if (!self::$instance) { self::$instance=new A(); } return self::$instance; } public function Anything() { return 3.14; } } class B { public function Anything2() { $tridaA=A::getInstance(); $pi=$tridaA->Anything(); } } |
||
Keeehi Profil |
#5 · Zasláno: 30. 6. 2012, 11:40:13
Jedna možnost je statická metoda. Když se to tak vezme, tak je to vlastně jen obyčejná funkce z procedurálního programování obalená třídou.
class Math { public static function pi() { return 3,1415926535898; } } class Circle { public $radius = 0; public function getCircumference() { return 2 * $this->radius * Math::pi(); } } $circ = new Circle(); $circ->radius = 5; echo "Circumference of circle with radius $circ->radius is $circ->getCircumference()"; Mohl by jsi ukázat ten tvůj kód, se kterým máš problém? Podle tvého popisu se v tom trochu ztrácím. |
||
naromax Profil |
#6 · Zasláno: 30. 6. 2012, 12:00:37
Mike8748:
Zde jsem ho samozřejmě neuváděl, jen jsem chtěl ukázat, o co mi vlastně jde. To, co jsi napsal jsem již zkoušel, ale psal jsem, že je to v mém případě hrozně krkolomné. Keeehi: Také díky za ukázku, ale to také není úplně to pravé ořechové. Já mám v jednom souboru vytvoření instance různých tříd a s nimi potom v aplikaci potřebuji pracovat nehledě na to, jestli jsou použiti uvnitř nějaké třídy, či samotny ve stránce. Nelze k té proměnné, do které instanci ukládám, nějak definovat, že lze použít úplně všude (nějaké global, nebo já opravdu nevím)... |
||
Keeehi Profil |
#7 · Zasláno: 30. 6. 2012, 12:11:43
naromax:
Bez kódu se opravdu nehnu. Stačí i nějaká ořezaná ukázka, ale zase aby to nebylo příliš obecné. |
||
Mike8748 Profil |
#8 · Zasláno: 30. 6. 2012, 18:02:44
naromax:
„Nelze k té proměnné, do které instanci ukládám, nějak definovat, že lze použít úplně všude“ nelze. maximálně mužeš instance ukládat do pole $GLOBALS a pracovat pak s tim, ale je to opravdu nehezkej způsob „To, co jsi napsal jsem již zkoušel, ale psal jsem, že je to v mém případě hrozně krkolomné.“ psal si neco jiného. psal si že si zkoušel v třídě B vytvořit instanci A, což je něco jiného. už jenom proto že u singletonu nemáš co vytvářet instanci, ta se vytvoří sama když je to zapotřebí. ale je to hrozně krkolomné, protože první třídu potřebuji využít ve velkém množství dalších tříd. využití v dalších třídách nic nebrání. instance A bude existovat pořád jedna. a co je na tom krkolomného? to že tam musíš před použitím načíst tu instanci do proměnné? to už rovnou v každé metodě kde to chceš použít můžes volat global $instance_A; , ale to už s objektovým programováním nebude mít moc společného
|
||
Časová prodleva: 12 let
|
0