[PHP] OOP/MySQLi

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Bv202
  • Registratie: Oktober 2006
  • Laatst online: 14-11-2021
Hey,

Aangezien ik MySQLi wil gebruiken en dit via de OOP weg, heb ik even wat gelezen over OOP in PHP. ik heb al wel wat ervaring uit andere talen zoals Java, maar de syntax in PHP vind ik echt verschrikkelijk verwarrend en heb er toch nog een paar vragen over.

Tevens wil ik graag slechts één mogelijke databaseverbinding en daarom lijkt het me logisch hiervoor een Singleton te gebruiken. Ook dit is iets waar ik geen ervaring mee heb (buiten dat ik de theorie ken dan :p), dus ook dit is even verwarrend.

1) Als ik de documentatie over de class bekijk (http://www.php.net/manual/en/class.mysqli.php) wordt er een datatype gebruikt bij de velden, return types en parameters.Waarom is dit? In PHP gebruik je deze toch niet?

2) Ik vind de notatie van methoden en velden verschrikkelijk verwarrend. De ene keer wordt :: gebruikt, de andere keer ->. Blijkbaar wordt :: gebruikt voor static methods, maar in de methodelijst (zie link hierboven) wordt het blijkbaar ook voor gewone methodes gebruikt. En dan wordt er soms geen van beide notaties gebruikt, maar gewoon de naam van de methode, zoals:
int mysqli_get_proto_info ( mysqli $link )

Bij die methodelijst wordt zelfs -> gewoon niet gebruikt. Hoe zit het hier precies mee? Wat een verwarrende syntax :s

3) Dan hebben we die singleton. Ik dacht dat ik een class Database kon maken die overerft van MySQLi en daar een singleton van maken. Dit werkt wel lijkt me, maar het probleem is dat sommige methodes zo'n statement object returnen:
http://www.php.net/manual/en/class.mysqli-stmt.php

Kan ik hier wel een singleton gebruiken? Hoe gaat dit precies werken?

4) Sprekend over die 2 classes, wat is het precieze verschil? Beide klassen hebben blijkbaar een prepare() methode die blijkbaar ook nog eens exact hetzelfde doen.

Alvast bedankt! :)

Acties:
  • 0 Henk 'm!

  • BlackHawkDesign
  • Registratie: Maart 2005
  • Laatst online: 06-07 12:32
1) Volgens mij is dat alleen maar om aan te geven wat je terug kan verwachten, dus alleen maar om meer duidelijkheid in de documentatie te scheppen.

2)
:: wordt inderdaad voor static methodes gebruikt, indien het dus methodes van een class zijn. Waar zie je dan dat het voor een normale methode gebruikt wordt?

-> wordt gebruikt voor 'normale' methodes van een class. Je moet dus een eerst een instance maken van een class om deze methode aan te roepen

functionpiet() wordt gebruikt als de methode/function geen onderdeel is van een class. Je kan immers ook functies buiten een class definiëren.

3)
a. Je wilt gewoon niet hebben bij een database dat er onnodige connecties blijven openstaan.
b. Een singleton hiervoor gebruiken is niet de geschikte oplossing. Immers, het is geen ramp om meerdere database classes te hebben. Ook is het niet erg als je gelijktijdig 2 connecties naar de database hebt.
c. Je moet dus gewoon je database class zo coden dat deze netjes de verbinding opent en sluit en dat je hier heel consistent mee bent.

4) De een is een connectie en de andere een statement om een statement uit te voeren heb je een connectie nodig.

[ Voor 17% gewijzigd door BlackHawkDesign op 24-10-2010 19:22 ]


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 09-07 15:06
Bv202 schreef op zondag 24 oktober 2010 @ 18:38:Tevens wil ik graag slechts één mogelijke databaseverbinding en daarom lijkt het me logisch hiervoor een Singleton te gebruiken. Ook dit is iets waar ik geen ervaring mee heb (buiten dat ik de theorie ken dan :p), dus ook dit is even verwarrend.
Het afdwingen van slechts één enkele instantie kun je inderdaad middels het Singleton design pattern. Persoonlijk vind ik die niet van toepassing op je database verbinding, het is geen enkele probleem als er daar meerdere van zijn, in tegenstelling tot een Router of Security layer. Maar daarvoor loopt momenteel al een ander topic; Singleton: vermijden of juist niet?
1) Als ik de documentatie over de class bekijk (http://www.php.net/manual/en/class.mysqli.php) wordt er een datatype gebruikt bij de velden, return types en parameters.Waarom is dit? In PHP gebruik je deze toch niet?
PHP is dan wel loose-typed, maar intern kent deze nog steeds variabele typen. Zie het als pure aanvulling op de documentatie om een beter beeld te krijgen van wat er in- en uitgaat.
2) Ik vind de notatie van methoden en velden verschrikkelijk verwarrend. De ene keer wordt :: gebruikt, de andere keer ->. Blijkbaar wordt :: gebruikt voor static methods, maar in de methodelijst (zie link hierboven) wordt het blijkbaar ook voor gewone methodes gebruikt. En dan wordt er soms geen van beide notaties gebruikt, maar gewoon de naam van de methode, zoals:
int mysqli_get_proto_info ( mysqli $link )
MySQLi kun je op 2 manieren gebruiken; procedureel en object geörienteerd.
Voor de procedurele benadering gebruik je de functie die zijn geprefixed met "mysqli_". In OOP gebrruik je de methods die over het algemeen dezelfde naam hebben, maar dan zonder de prefix.
In de documentatie worden steeds beide methoden omschreven.

Een object call wordt in documentatie vaker vanuit een static call omschreven, omdat je in je documentatie geen voorbeeld instantie hebt. Ze kunnen wel "$oMysqli->connect()" schrijven maar dan ga je je weer afvragen waar die $oMysqli vandaan komt. Kijk dus vooral niet naar de examples of een method wel of niet static is, maar naar de method documentatie zelf.
3) Dan hebben we die singleton. Ik dacht dat ik een class Database kon maken die overerft van MySQLi en daar een singleton van maken. Dit werkt wel lijkt me, maar het probleem is dat sommige methodes zo'n statement object returnen:
http://www.php.net/manual/en/class.mysqli-stmt.php

Kan ik hier wel een singleton gebruiken? Hoe gaat dit precies werken?
Jouw (singleton) object kan prima een MySQLi_STMT instantie returnen. Of indien dat nodig is, een object van jezelf die MySQLi_STMT overload.
4) Sprekend over die 2 classes, wat is het precieze verschil? Beide klassen hebben blijkbaar een prepare() methode die blijkbaar ook nog eens exact hetzelfde doen.
MySQLIi is niet bepaald het schoolvoorbeeld van een nette extensie. Er zijn meerdere manieren om hetzelfde te doen, en die zijn ook vrijwel allemaal door elkaar heen gedocumenteerd.
In dit geval is het verschil tussen MySQLi en MySQLi_STM mijns inziens toch wel vrij helder; het 2de gebruik je voor prepared statements terwijl het eerste je daadwerkelijke interface naar de database is.

Acties:
  • 0 Henk 'm!

  • Bv202
  • Registratie: Oktober 2006
  • Laatst online: 14-11-2021
Hey,

Bedankt voor de reacties :)

Goed, die Singleton laat ik voorlopig voor wat het is :)
In dit geval is het verschil tussen MySQLi en MySQLi_STM mijns inziens toch wel vrij helder; het 2de gebruik je voor prepared statements terwijl het eerste je daadwerkelijke interface naar de database is.
Dit snap ik toch nog steeds niet goed. Beide klassen hebben een prepare() methode, waarom? Echt logisch klinkt dit niet :s

Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
1) Je kunt wel een bepaalde classe afdwingen.
PHP:
1
public function foo(Foo $foo) {

Hiermee kan de parameter alleen een instantie van (een subclasse van) Foo hebben.

2) :: is inderdaad static:
PHP:
1
2
3
4
5
6
7
 class Foo {
    public $bar
    public static $staticBar;
}
Foo::$staticBar = true;
$f = new Foo();
$foo->bar = false;

Bij variablen die je static aanroept dus even opletten en niet de $ vergeten. In de documentatie staat alles Class::functie omschreven omdat de documentatie natuurlijk niet weet in welke instance je de new Class(); gaat stoppen.

3) Als je in java geen singletons gebruikt hebt zou ik dat nu ook niet in php doen.

4) Ik gebruik zelf geen MySQLi maar Zend_Db of Doctrine, misschien interessant om naar te kijken voor jou. Maar van hoe ik het nu zie is MySQLi meer de connectie en MySQLi_STMT de query die je kunt uitvoeren en uitlezen.

(Verschil in prepare is dat mysqli een statement returnt en mysqli_statement een boolean)

[ Voor 5% gewijzigd door ReenL op 24-10-2010 20:57 ]


Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Bv202 schreef op zondag 24 oktober 2010 @ 18:38:
1) Als ik de documentatie over de class bekijk (http://www.php.net/manual/en/class.mysqli.php) wordt er een datatype gebruikt bij de velden, return types en parameters.Waarom is dit? In PHP gebruik je deze toch niet?
Hoezo gebruik je die niet? Je geeft ze niet altijd aan inderdaad, en je kan zomaar van type veranderen ja. Maar je kan toch types gebruiken/vergelijken/... . Kijk maar naar de '===' operator.
Bv202 schreef op zondag 24 oktober 2010 @ 19:39:
Dit snap ik toch nog steeds niet goed. Beide klassen hebben een prepare() methode, waarom? Echt logisch klinkt dit niet :s
Kijk eens wat die methode bij mysqli terug geeft ...

Acties:
  • 0 Henk 'm!

  • Freeaqingme
  • Registratie: April 2006
  • Laatst online: 20:42
ReenL schreef op zondag 24 oktober 2010 @ 20:55:
4) Ik gebruik zelf geen MySQLi maar Zend_Db of Doctrine, misschien interessant om naar te kijken voor jou.
Daar even op in-/aanhakend PHP heeft een hoop quirks en onhandigheden vanwege BC problemen en andersoortige legacy meuk. In ##java op freenode.org werd ZF een keer omschreven als "the java for php', wellicht dat daarom ZF beter bij je aansluit dan plain php, gezien je java achtergrond. Echter voordat je er aan begint moet je wel even de php notatie doorhebben, maar dat kan niet zo moeilijk zijn.

No trees were harmed in creating this message. However, a large number of electrons were terribly inconvenienced.

Pagina: 1