[PHP] Static Objects/Methods

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 13:48

Saven

Administrator

Topicstarter
Hey,
Ik ben bezig met OOP, maar dan voor PHP5.
Nu kwam ik tegen dat je ook "static" objects en methods kan gebruiken. objecten die je kan gebruiken zonder dat je de klasse start zegmaar.

Maar wat is het nut hier nou precies van? Spaart het parsetime ofzo. Anders kun je toch net zo goed zonder static objects werken?
Ik heb al gegoogled natuurlijk, maar ik kon er niet veel over vinden, behalve informatie dat je het aan kan roepen zónder het "starten" van de class, maar niet waarom het handig is.

Acties:
  • 0 Henk 'm!

  • ibmos2warp
  • Registratie: Januari 2007
  • Laatst online: 20-11-2023

ibmos2warp

Eval is Evil

Is dit misschien wat?

Ik weet alles van niks
Vind Excel ongelovelijk irritant.


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 13:48

Saven

Administrator

Topicstarter
Mwah niet echt wat ik zocht :P

Maar als het parsetime spaart, kun je toch veel beter alléén maar static methods/objects gebruiken?

Acties:
  • 0 Henk 'm!

  • truegrit
  • Registratie: Augustus 2004
  • Laatst online: 19-09 19:31
soms is het wel handig, bijvoorbeeld bij een Settings object, want als je er toch maar 1 van hebt is het nutteloos om ergens een instantie van te maken en hem dan overal als argument mee te geven.

hallo


Acties:
  • 0 Henk 'm!

  • Zyppora
  • Registratie: December 2005
  • Laatst online: 12-09 10:59

Zyppora

155/50 Warlock

Een static methode kan handig zijn wanneer je functionaliteit nodig hebt die onafhankelijk van een object beschikbaar moet zijn. Streng-OO talen zoals Java forceren dat je OOP't, dus ALLES in klasses.

Ik heb eens een MySQL connector klasse geschreven voor PHP5, waarin bijvoorbeeld een static methode stripHarmfulCharacters() kwam kijken, welke de mysql_real_escape_string() functie een beetje uitbreidde. Die functie hoort wel bij zo'n connector klasse, maar heeft er geen instantie van nodig om toch goed te functioneren. Staat wel zo netjes om alles bij elkaar te hebben.

Eventuele denk-, meet-, schrijf-, typ- en rekenfouten voorbehouden.

[ Voor 4% gewijzigd door Zyppora op 25-05-2007 21:38 ]

Phenom II X4 945 \\ 8GB DDR3 \\ Crosshair IV Formula \\ R9 290


Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 11:40
Zyppora schreef op vrijdag 25 mei 2007 @ 21:36:
Ik heb eens een MySQL connector klasse geschreven voor PHP5, waarin bijvoorbeeld een static methode stripHarmfulCharacters() kwam kijken, welke de mysql_real_escape_string() functie een beetje uitbreidde. Die functie hoort wel bij zo'n connector klasse, maar heeft er geen instantie van nodig om toch goed te functioneren. Staat wel zo netjes om alles bij elkaar te hebben.
Ik vind dat niet zo handig, stel je voor dat je meerdere implementaties van zo'n database interface hebt, Zoals een Mysql-database een PostgreSQL database, etc... Dan moet die functie bij elk van die implementaties verschillend functioneren. Met zo'n static functie krijg je dit niet (mooi) voor elkaar.


Maar een leuke toepassing van static methodes is bijvoorbeeld een Singleton. Kijk ook eens naar al die andere design patterns, dan zul je het nut er wel van inzien.
Spaart het parsetime ofzo. Anders kun je toch net zo goed zonder static objects werken?
Nee, misschien een miljoenste miliseconde ofzo, daar hoef je het iig niet voor te doen. Maar waarom je het dan zou gebruiken? Omdat je daar bepaalde programma constructies netter mee kan maken.

[ Voor 24% gewijzigd door robbert op 25-05-2007 21:51 ]


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Je hebt 20 berichtjes, allemaal afgebeeld, die haal je op via je connectorklasse, en stop je een voor een in een Bericht(titel, bericht) object. En telkens roep je de static aantalObjectenplusplus(); aan, die een static var $aantalberichten + 1 doet, en opslaat.

Ieder object heeft zijn eige titel en bericht, maar ze hebben allemaal hetzelfde $aantalberichten, en die kun je dan bijvoorbeeld ophalen met getAantalberichten(), zo kan je bijvoorbeeld een linkje maken: nieuws($aantalberichten);

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 20-09 00:30
robbert schreef op vrijdag 25 mei 2007 @ 21:47:
[...]

Ik vind dat niet zo handig, stel je voor dat je meerdere implementaties van zo'n database interface hebt, Zoals een Mysql-database een PostgreSQL database, etc... Dan moet die functie bij elk van die implementaties verschillend functioneren. Met zo'n static functie krijg je dit niet (mooi) voor elkaar.
Dus jij gebruikt ook mysql_real_escape_string voor bijvoorbeeld Oracle? Drie keer raden waarom die functie mysql_real_escape_string() heet ;)

Misschien dat hij voor enkele gelijksoortige databases goed werkt, maar het kan zomaar zijn dat er bij de ene database anders/meer/minder ge-escaped moet worden dan bij de ander, en dit is in mijn ogen ook gewoon een goede reden om daarvan een static methode te maken in de klasse voor die betreffende database :)

What do you mean I have no life? I am a gamer, I got millions!


Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 11:40
Morax schreef op vrijdag 25 mei 2007 @ 23:07:
[...]


Dus jij gebruikt ook mysql_real_escape_string voor bijvoorbeeld Oracle? Drie keer raden waarom die functie mysql_real_escape_string() heet ;)

Misschien dat hij voor enkele gelijksoortige databases goed werkt, maar het kan zomaar zijn dat er bij de ene database anders/meer/minder ge-escaped moet worden dan bij de ander, en dit is in mijn ogen ook gewoon een goede reden om daarvan een static methode te maken in de klasse voor die betreffende database :)
Volgens mij begrijp je me niet helemaal, stel je hebt het volgende:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
interface Database {
//een hoop functies die er niet toe doen
public function escapeString($str);
}
}
class MysqlDatabase implements Database {
public function escapeString($str) {
  return mysql_real_escape_string($str);
}
}

class PostgreSqlDatabase implements Database {
public function escapeString($str) {
  return pg_escape_string($str);
}
}


Op alle plekken waar je wat wil escapen doe je nu:
PHP:
1
$database->escapeString($blaat);


Stel nu dat die methode static is, dan moet je het volgende doen:
PHP:
1
MysqlDatabase::escapeString($blaat);

wil je nu echter plotseling een PostgreSQL database gaan gebruiken moet je dit allemaal gaan veranderen naar:
PHP:
1
PostgreSqlDatabase::escapeString($blaat);

Niet handig imho.

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Sowieso wil je in het geval van mysql_real_escape_string een instantie van je classe hebben aangezien die escape functie afhankelijk is van je connectie ivm charsets, en dus zou ik die escape functie niet static maken.

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 13:48

Saven

Administrator

Topicstarter
Erkens schreef op vrijdag 25 mei 2007 @ 23:38:
Sowieso wil je in het geval van mysql_real_escape_string een instantie van je classe hebben aangezien die escape functie afhankelijk is van je connectie ivm charsets, en dus zou ik die escape functie niet static maken.
Misschien niet helemaal relevant voor dit topic, maar mysql_real_escape_string is toch bijna hetzelfde als addslashes().

en die functie(s) gebruik je niet in de class zelf zegmaar, maar voor dingen die je wilt inserten. zoals:
PHP:
1
mysql_query("UPDATE tabel SET iets = '".addslashes($blaat)."'");


Dus ik snap het probleem van jullie niet helemaal :P

[ Voor 3% gewijzigd door Saven op 26-05-2007 16:45 ]


Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50

BikkelZ

CMD+Z

Het nut van een static wordt sowieso wat minder als je in PHP normaliter een probleem hebt als je thread langer dan een seconde bestaat. Maar je kunt bijvoorbeeld iedere instantie een nummer meegeven en aan de hand van die static uitlezen wat het laatste toegekende nummer was.

iOS developer


Acties:
  • 0 Henk 'm!

Verwijderd

een ander gebruik/misbruik er van is dat je het kan gebruiken om namespaces te implementeren aangezien een static method onder PHP vrijwel niet verschilt van een gewone functie kun je dus een class maken en daar al je methodes instoppen die je dan static aanroept.

op die manier vervuil je de global namespace niet met al je functies en hoef je niet overal een prefix voor te gaan bedenken. of het in performance veel uitmaakt durf ik zo niet te zeggen maar ik kan uit ervaring vertellen dat het best makkelijk werkt.

gewoon de combinatie van (class name)::(method naam) als in (namespace)::(functie naam) zoals in C.

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Saven schreef op zaterdag 26 mei 2007 @ 16:44:
[...]

Misschien niet helemaal relevant voor dit topic, maar mysql_real_escape_string is toch bijna hetzelfde als addslashes().

en die functie(s) gebruik je niet in de class zelf zegmaar, maar voor dingen die je wilt inserten. zoals:
PHP:
1
mysql_query("UPDATE tabel SET iets = '".addslashes($blaat)."'");


Dus ik snap het probleem van jullie niet helemaal :P
offtopic:

Nee absoluut niet, addslashes moet je in principe nooit gebruiken aangezien deze niet rekening houdt met de manier waarop en wat er ge-escaped moet worden, lees de manual pages er maar even op na ;)

Acties:
  • 0 Henk 'm!

  • FTPlus
  • Registratie: Februari 2003
  • Laatst online: 10-11-2024

FTPlus

Pluisje

Static variables kunnen handig zijn als je bijvoorbeeld een functie wil gebruiken die bepaalde waarden 'onthoud'. Natuurlijk zou je hier ook global variables voor kunnen gebuiken, maar static is gewoon makkelijker en netter, en de reden dat ze überhaupt bestaan in de taal. :P

Voor functies zie ik zelf wat minder nut, meestal als ik een functie global wil bereiken maak ik hem dat ook, of het moest echt heel specifiek bij de class horen. Er is een uitzondering: je kan het prima gebruiken om soort van namespaces bij php te hebben, en daar maak ik dan ook dankbaar gebruik van. :P

-=Waiz=-


Acties:
  • 0 Henk 'm!

  • Gwaihir
  • Registratie: December 2002
  • Niet online
Kijk ook 'ns naar een singleton. Daarin zit toch wel een mooi voorbeeld van het nut van een static (de variabele die je gebruikt om de ene instance in op te slaan).
Pagina: 1