Archief - PHP: Object gebruiken binnen functie?

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Cakeman

Legacy Member
Ik heb zopas zelf een mini-klasse gemaakt om een MySQL-database aan te spreken. Nu heb ik een probleem wanneer ik een instantie van die klasse binnen een functie wil gebruiken.

PHP:
$con = new Connectie("user", "pass", "host");
$con->connect();

function getPost($postid, $showcomments) {
  $query = "select * from post where id=$postid";
  $con->query($query);
}
getPost(5, true);
Dit geeft volgende fout: Fatal error: Call to a member function query() on a non-object

Dit is achteraf gezien logisch, omwille van de variable scope.
Ik heb het opgelost door de functie getPost als volgt te aan te maken:
PHP:
function getPost($postid, $showcomments, $connection)

Mijn code ziet er nu zo uit:
PHP:
$con = new Connectie("user", "pass", "host");
$con->connect();

function getPost($postid, $showcomments, $connection) {
  $query = "select * from post where id=$postid";
  $connection->query($query);
}
getPost(5, true, $con);
Nu werkt het wel.

Maar ik vraag me af of dit ik goede manier van werken is. Ik betwijfel het eerlijk gezegd :unsure:

|t3st

Legacy Member
waarom een class maken voor een simpele db-connectie ^o)

is zuivere overkill, doe dat gewoon met een functie als je dat echt wil maar doe het gewoon met mysql_select_db(); mysql_connect(); want een class schrijven voor zoiets is overkill

greetz Sluttie

Cakeman

Legacy Member
Ik doe het vooral voor de overzichtelijkheid... Alle controles en foutafhandelingen worden nu door mijn klasse gedaan waardoor ik minder code moet schrijven wanneer ik een database wil gebruiken.

servi

Legacy Member
function getPost($postid, $showcomments) {
global $con;

$query
= "select * from post where id=$postid";
$con->query($query);
}

m3rlin

Legacy Member
Cakeman zei:
PHP:
$con = new Connectie("user", "pass", "host");
$con->connect();

function getPost($postid, $showcomments, $connection) {
  $query = "select * from post where id=$postid";
  $connection->query($query);
}
getPost(5, true, $con);
Nu werkt het wel.

Maar ik vraag me af of dit ik goede manier van werken is. Ik betwijfel het eerlijk gezegd :unsure:


Ja, dat is een goede manier van werken, maar het wordt doorheen gans u script handiger van u instantie als een globale variabele te declareren. Waarom ? Anders zal elke methode een extra parameter nodig hebben om met diezelfde connectie te werken.

Waarom is het toch een goede manier van werken ? Stel u voor dat ge aan het werken zijt in een omgeving met een paar connecties naar telkens een andere database... ;) (+ dat een extra parameter tov een globale declaratie een pluspunt is ivm security!)

Dus in u geval, waar ge slechts 1 instantie nodig hebt om doorheen het ganse script te gebruiken, is het handiger om die globaal te declareren.

servi

Legacy Member
Globale declaratie van variabelen = big nono

dat valt te bezien. Het gedrag van php als het gaat over ojecten is niet wat je er van verwacht. in c++ zou er hier geen sprake zijn van een globale variabele.
Maar in php heb je geen keuze en moet je ofwel het doorgeven als parameter ( met als gevolg dat je met een vrij lange paramterlijst dreigt te komen en dat er bij het doorgeven van parameters een kopie wordt gemaakt wat dus trager is).
De andere oplossing is dan om dat object global te gebruiken. ( uit de redenering dat het eigenlijk basisfuncties zijn zoals bijvoorbeeld strlen() )
Zoals duidelijk in dit voorbeeld is het hier eigenlijk een verzameling van basisfuncties die worden doorgegeven.

edit nog een reden om te opteren voor de global-declaratie : om gemakkelijker te kunnen zien wat de echte variabelen zijn.

Klein voorbeeldje van een pagina van mij :
// ik geef alleen de omschrijvingen de volledige code heb ik weggelaten
Code:
  class gebruiker {
  	 function gebruiker($sessieid=''); // global $CONFIG;
  	 function inloggen($gebruikerid,$gevormde_pas); // global $db,$CONFIG;
  	 function maak_sessie(); // global $CONFIG;
  	 function uitloggen(); // geen global
  }

$db is een klasse waarin ik al mijn sql-functionaliteiten heb insteken
$CONFIG is een array met alleen constanten die beschrijven hoe bepaalde zaken moeten werken ( bijvoorbeeld of er cookies moeten gebruikt worden bij het inloggen, hoelang een sessie duurt, ... )
anders zou dit moeten zijn :

Code:
   class gebruiker {
   	 function gebruiker($CONFIG,$sessieid='');
   	 function inloggen($db,$CONFIG,$gebruikerid,$gevormde_pas); 
   	 function maak_sessie($CONFIG);
   	 function uitloggen();
   }

dat valt allemaal goed mee voor 1 klasse, maar als je een stuk of 5 klassen hebt, weet je echt niet meer welke klasse je nu moet doorspelen via de parameters.

Ik vind dat dit meer beantwoord aan de blackbox-omschrijving van een object, dan een object waar je moet weten welke andere objecten je nog nodig hebt om de functie goed te laten werken.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan