Autor Zpráva
naromax
Profil
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
Co toto?
$trida = new Neco();
$trida2 = new Neco2($trida);
//------------------------------------
class Neco2 {
    private $trida;
    function __construct($trida) {
        $this->trida=$trida;
    }
}
OOP se teprve učím, takže pokud se jedná o kravinu nekřičte na mě prosím :), děkuji.
naromax
Profil
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
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
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
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
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
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

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: