[Alg|PHP5]Singleton of statische functies?

Pagina: 1
Acties:

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ik heb een vraagje over een Singleton.

Ik heb een class in php genaamd Configuration. Dit is een singleton en bewaart zijn enige instance in een statisch veld en returned deze via een getInstance method, welke ook statisch is. Nu heb ik verder in deze class 1 normale method geimplementeerd, namelijk getValue(). Om een configuratie waarde op te halen voer ik nu dit uit:
code:
1
Configuration::getInstance()->getValue("waarde");

Nu zat ik gister na te denken of een mogelijke verbetering, namelijk een extra statische functie implementeren met dezelfde naam als getValue(). Deze method roept dan voor mij de net genoemde regel aan en returned het resultaat. Dan zou ik dus dit krijgen:

code:
1
Configuration::getValue("waarde");

Ik heb nog steeds de mogelijkheid om een instance van de classe op te halen en de functie 'normaal' uit te voeren.

Nu stuit ik hier op een probleem dat dit geheel niet mogelijk is omdat je geen twee functies met dezelfde naam mag implementeren met dezelfde parameters (of uberhaupt dezelfde naam, dat weet ik niet).

Dit vind ik zowiezo al vreemd omdat een statische functie alleen is aan te roepen met de class naam en :: (bv. Configuration::method()), en de method is alleen aan te roepen vanuit een instance (bv. $configInstance->method()). Onmogelijk om dan de verkeerde method te kiezen, dus ik zie het probleem niet zo.

Of zie ik dit al verkeerd?

Verder denk ik er dan aan om de getValue method geheel statisch te maken en de class geen singleton meer te maken.

Wat zijn de redenen om dit niet te doen?

Hoeft niet perse hier van op toepassing zijn, maar is het slecht om een class te hebben zonder non-statische methods en velden?

Of kan ik dit gewoon doen zonder dat ik problemen hoef te verwachten in de toekomst?

[ Voor 23% gewijzigd door Michali op 07-10-2004 16:35 ]

Noushka's Magnificent Dream | Unity


Verwijderd

Je keuze om een statische methode te maken kan ik geheel inkomen. Ik gebruik voor hetzelfde doel de statische methoden Context::set($key, $value) en context::get($key). Intern maken deze twee echter gebruik van een singleton, omdat ik nog wat meer methodes heb die niet statisch zijn (voor het laden van inifiles, of vullen vanuit een config.php script).

Heb je echter maar 1 methode dan is een singleton niet echt meer nodig. Je kunt dan de array of whatever waarin je zooi opslaat ook static declaren in die methode.

  • dingstje
  • Registratie: Augustus 2002
  • Laatst online: 02-01-2024
Als je een class nodig hebt die effectief een bepaald object specifieert (bvb. een klasse 'mens', elke mens heeft eigen properties). Je moet het zien: vanaf het moment dat je voor elke functie een extra identificatieargument zou moeten opgeven moet je werken met objecten met properties, wanneer je een stateless klasse hebt (bvb. een klasse die je gewoon plat instellingen wilt laten opvragen, kan je best statische functies gebruiken aangezien je toch geen extra data moet opslaan).

PHP:
1
2
3
4
5
6
class mens {
private $lengte;
private $gewicht;
private $karakter;

public function groei() { $this->lengte++; }

PHP:
1
2
3
4
5
class Settings {
public static function getSetting() {
    return conn::getInstance()->getField("SELECT ...", 1,1); 
}
}

[ Voor 3% gewijzigd door dingstje op 07-10-2004 17:47 ]

If you can't beat them, try harder


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Het kan zijn dat je singleton naast functionaliteit ook state aanbiedt. Bijv. in jouw geval zou je slechts eenmalig alle config settings kunnen ophalen en die opslaan in wat instance fields. In dat geval is een singleton handiger. Maar veel belangrijker, als ik zeg dat iets een singleton is, dan weet iedereen wat daarmee wordt bedoeld. Als je het over classes hebt, dan is het direct duidelijk dat als je iets met een configuratie wilt doen, je dit via de singleton config kan bereiken. In het geval van een static method moet je dat er eigenlijk altijd bij zetten.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Thanks voor de goede input. Ik denk inderdaad dat ik hem gewoon sinlgeton laat. Mischien dat later nog extra configuratie instellingen vereist zijn die wel opgeslagen moet worden in de class instance velden.

Noushka's Magnificent Dream | Unity