OOP - Statická metoda a vnitřní public call – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

OOP - Statická metoda a vnitřní public call – PHP – Fórum – Programujte.comOOP - Statická metoda a vnitřní public call – PHP – Fórum – Programujte.com

 

Blah
~ Anonymní uživatel
4 příspěvky
26. 9. 2015   #1
-
0
-

Mam určitou třídu, která se stará o zprostředkování MySql připojení.

Dostal jsem se do situace kdy, jsem potřeboval z mé třídy volat public non-static metodu ze statické. To jsem ale vyřešil, ale vlastně jsi nejsem úplně jistý, jak danný kod funguje.

Původní kod byl následující, samozřejmě s chybovou hláškou že nemůžu volat ze staticé funkce, funkci non-static. (Ještě předtím jsem to zkoušel s klíčový slovem $this->, místo self, a význám těchto keywordů znám).

<?php

class MySQLHander
{
...
public Connection()
{...}

public static function TestQuery()
{	
		return self::Connection()->query('SELECT `Charset`, `Title` FROM `Page`')->fetch_object()->Charset; 
}

Pomocí inspirace z jiné třídy, jsem narazil na řešení s proměnou $Instance, která slouží jaký si "zpřostředkovatel" (osobně si to tak vysvětluji) , mezi statickou ---> (a) public non-static funkcí.

Moje otázka zní je to řešení tak nějak správné, či validní, neudělá to v kodu nějaký "bordel" ?

Taky by bylo dobré zda by mě někdo vysvětlil, či nasměroval na odpověď, co jsem tou úpravou vlastně udělal.

Díky za spolupráci.

Nahlásit jako SPAM
IP: 212.96.160.–
Blah
~ Anonymní uživatel
4 příspěvky
26. 9. 2015   #2
-
0
-

 Toto je funkční kod, který jsem zapoměl připojit.

	public static function TestQuery()
	{
		if(!self::$Instance)
			self::$Instance = new self();
		
		self::$Instance->Connection()->query('SET NAMES `utf8`');		
		

		return self::$Instance->Connection()->query('SELECT `Charset`, `Title` FROM `Page`')->fetch_object()->Charset; 
	}
	
Nahlásit jako SPAM
IP: 212.96.160.–
ondrej39+1
Věrný člen
26. 9. 2015   #3
-
0
-

#2 Blah
A proč to potřebuješ volat staticky? Proč si prostě nevytvoříš instanci té třídy obsahující metodu TestQuery a nezavoláš metodu na vytvořeném objektu?

Ten kousek kódu, který je funkční, se nazývá Singleton, a není to zrovna moc oblíbený návrhový vzor, protože se ve většině případů používá špatně, stejně jako jsi ho špatně použil ty.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
Blah
~ Anonymní uživatel
4 příspěvky
26. 9. 2015   #4
-
0
-

Moje situace vyžaduje abych metodu volal staticky, kdybych mohl, tak si neni problém vytvořit instaci a zavolat to přes ní.

Nahlásit jako SPAM
IP: 212.96.160.–
Kit+15
Guru
26. 9. 2015   #5
-
0
-

#2 Blah
Ten Singleton má také jednu vážnou nectnost: Můžeš s ním otevřít jen jednu databázi. Někdy jich však potřebuji víc - typicky dvě, ale nechci se nechat omezovat počtem. Proto ani k tomuto účelu statické třídy nepoužívám.

Statické třídy doporučuji vůbec (nebo skoro vůbec) nepoužívat. Hodí se jen pro speciální účely, u kterých není žádoucí udržovat nějaký vnitřní stav objektu. Například sbírka goniometrických funkcí žádný vnitřní stav mít nesmí.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
26. 9. 2015   #6
-
+1
-
Zajímavé

#4 Blah
Neznám takovou situaci, kdy bych musel databázi otvírat staticky. Nech si poradit, házíš si kladky pod nohy. Třídy, které takovou staticky otevřenou databázi používají, se ani nedají řádně testovat.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 58 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý