[oop] wanneer statisch?
Ik heb een (functie)class gemaakt waarmee je een complete directory verwijdert. De werking is ongeveer zo:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$delete_directory = new DirectoryDeleter('/pad/naar/de/directory/', 301); // 301 is de http status
$delete_directory->deleteDirectory();
?>
$delete_directory = new DirectoryDeleter('/pad/naar/de/directory/', 301); // 301 is de http status
$delete_directory->deleteDirectory();
?>
Nu zat ik me ineens te bedenken dat ik hier (en waarschijnlijk in vele vergelijkbare situaties) ook een statische class van zou kunnen maken die als volgt werkt:
Nu vroeg ik me dus af wat eigenlijk het verschil is, en wat de beste optie is?
Iemand die mijn vraag kan beantwoorden?
Statics gebruik ik nooit met 1 uitzondering: factory methods
vb.
je hebt een class execute die er voor zorgt dat je applicatie geëxecute wordt dus je maakt iets aan van
dan zou je dit het beste static kunnen maken. Waarom? nou heel simpel omdat je niet 2 methodes wilt hebben die je applicatie opstarten, of runnen.
dus dan zou je moeten hebben
Ik weet niet of ik je vraag goed heb begrepen zo en zo ook eventueel goed heb uitgelegd maar dat zie ik dan wel weer :)
Maar in het algemeen kunnen we stellen dat we eigenlijk nooit static classes gebruiken dus?
Toevoeging op 01/05/2013 23:21:13:
@Reshad... volgens mij is het daar niet voor bedoeld... (en ik kan nog steeds meerdere applicaties opstarten in jouw voorbeeld als ik de functie meerdere malen aanroep)
Quote:
een factory kan toch zijn om bijv een formulier met inputvelden te maken?
Nee, een factory is een method die een klasse aanmaakt.
Quote:
Maar in het algemeen kunnen we stellen dat we eigenlijk nooit static classes gebruiken dus?
Ligt aan je smaak. Ik doe het nooit en symfony doet het nooit. Maar laravel bijv. gebruikt bijna niks anders.
Is statisch minder "object gericht" omdat je eigenlijk geen nieuwe classes aanmaakt?
Gewijzigd op 01/05/2013 23:33:37 door Ozzie PHP
Stel je roept die static methode eenmaal aan. dan heb je dus
een nieuwe ozziesApplication(); aangemaakt. vervolgens runt je applicatie en je komt weer dezelfde methode tegen ergens op regeltje 301324 en dan doe je
new reshadApplication(); dan krijg je een dikke error aan je broek omdat je een static methode niet kunt overriden. vandaar ook dat het static is.
En dus zal er weer een nieuwe ozziesApplication worden aangemaakt
Gewijzigd op 01/05/2013 23:37:29 door Ozzie PHP
Wouter J op 01/05/2013 23:31:01:
Maar laravel bijv. gebruikt bijna niks anders.
Laravel gebruikt eigenlijk helemaal geen statics.
De classes die je statisch aanroept zijn aliasen voor het voor het instantieren van een nieuwe class.
Moet je maar eens zoeken op Laravel facades.
Gewijzigd op 01/05/2013 23:50:49 door Tim S
0zzie, volgens mij heb ik je dat al vaker uitgelegd, maar even 2 redenen:
- Statics zijn niet te testen
- een static class is leuk voor het groeperen van functies, maar je kan nou niet echt spreken van objecten...
Tim, het zijn wel statics alleen ze hebben een naampje gekregen (die ik overigens voor de simpelheid maar even weg had gelaten)
Gewijzigd op 01/05/2013 23:50:35 door Wouter J
Allright, er komt weer iets bovendrijven... thanks Wouter!
Wouter J op 01/05/2013 23:49:00:
Tim, het zijn wel statics alleen ze hebben een naampje gekregen (die ik overigens voor de simpelheid maar even weg had gelaten)
0 statics
Leuk he, een link geven die niet over het onderwerp (facades) gaat? Nee, ik zou heel graag het verschil tussen facades en statcs leren...
Wouter J op 01/05/2013 23:59:53:
Leuk he, een link geven die niet over het onderwerp (facades) gaat? Nee, ik zou heel graag het verschil tussen facades en statcs leren...
Dan stel ik voor om zoals ik eerder al zei "maar eens te zoeken op Laravel Facades". I.p.v. meteen te zeggen dat het niet zo is, en dat ze alleen maar een naampje gekregen te hebben. :S
In dit artikel worden facades uitgelegd.
Ik weet wel wat facades zijn, maar het zijn en blijven bewoon static methods. Iemand heeft ooit bedacht dat je dit soort dingen met static methods kan doen en die heeft toen het facade design pattern bedacht, sindsdien zijn het static methods met een naampje, namelijk facade.
Elke methode die geen $this nodig heeft, kan je statisch maken.
Een voorbeeld: een methode die controleert of user input niet leeg is, of informatie bevat in een juiste dataType ... en true of false teruggeeft. Dit is dus puur verwerken. Niets opslaan, niets nodig van eigenschappen...
Code (php)
Wanneer je zo'n soort functie hebt, heb je er alle belang bij om die methode statisch te maken.
Je sleurt namelijk het object niet mee in de methode. De scope in die methode blijft ook heel klein.
Gewijzigd op 02/05/2013 11:08:23 door Kris Peeters
Het is alleen een beetje lastig... in mijn voorbeeld in mijn allereerste bericht heb ik het over een directory deleter. Hierbij gebruik ik wel $this, want in de constructor geef ik de directory mee en de constructor set deze in een property.
Code (php)
Nu kan ik ook een statische methode gebruiken en de directory meegeven aan die statische methode. En dat zal ook prima werken. De vraag is nu alleen wat je het beste kunt gebruiken en waarom?
Een functie kan best zo weinig mogelijk nutteloze informatie mee sleuren in zijn geheugen.
Dus, ik denk in de eerste plaats aan een class met meerdere methodes. Naast de getters en setters kunnen er methodes zijn die data verwerken en iets terug geven.
Binnen zo'n context is het interessant om die methodes statisch te maken.
Zoals je zelf suggereert in je laatste vraag: ja, inderdaad; ik zou soms aanraden om de data mee te geven met de parameter van de functie, en niet met $this.
Zoals je de vraag nu stelt, weet ik niet of het interessant is voor jouw voorbeeld; of je er netto iets aan over houdt. Want het betekent misschien dat je extra methodes gaat maken en zo.
't Is een kwestie van smaak, lijkt me.
Een bijkomend ding: statische methodes doen je nadenken over wat een functie echt is, wat het doet en waarom je dat gebruikt.
Namelijk: je krijgt iets binnen, je geeft een return terug naar wie er om vroeg.