Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

[OO PHP] Handles binnen verschillende methods

None
4 antwoorden
  • Maar weer eens een vraag vanaf het Object Oriented PHP front voor beginners

    Hoe "onthoud" ik (het beste) een handle in een class? Of hoeft dat helemaal niet?
    Ik zit namelijk met het volgende.
    Ik heb een class aangemaakt voor database handelingen, met daarbinnen de diverse handelingen als methods
    Zo zijn er b.v. methods voor het verbinden naar en openen van de database, voor het uitvoeren van een zoek query, voor het afsluiten van de verbinding met de database

    Als ik nu met een database verbind, dan gaat dat dus m.b.v. een handle. (B.v. $DBconnection = MySql_connect enz. enz.);)
    Nu heb ik die handle (in dit geval dus $DBconnection) later in een andere method weer nodig om de verbinding te sluiten (MySql_close ($DBconnection);)

    Nu vraag ik me dus af hoe ik dat het beste aanpak. Ik kan natuurlijk de handle gewoon hard coden en overal dezelfde handle gebruiken. Dat zal in de meeste gevallen prima gaan. Maar omdat classes toch (ook) bedoeld zijn om vaker toe te passen binnen verschillende toepassingen is het vooraf helemaal niet zo zeker of dat wel altijd gewenst is lijkt me.

    Overigens nog een subvraag.
    Ik heb voor het sluiten van de database verbinding ook een method gemaakt, terwijl dat in feite geen vermindering van de code opleverd in de index.php ($DBhandling->close_DB(); i.p.v. MySql_close ($DBconnection);) Maar gezien de object oriented gedachte leek het me logischer en mooier om het toch via een class te doen. Zit ik nu moeilijker te doen dan nodig of klopt mijn gedachtengang een beetje?
  • Het is me niet helemaal duidelijk wat het probleem nou is, maar ik zal proberen te formuleren hoe je dit (mijns inziens) het beste aanpakt. Er zullen ongetwijfeld ook andere goede manieren zijn.

    Allereerst heb je natuurlijk de gegevens die je nodig hebt om te verbinden met de database. Deze zou ik buiten de root van je domein plaatsen (dus niet oproepbaar vanaf het internet maar in een afgeschermde locatie) en vervolgens includen. Waarom? Omdat je het op deze manier bijzonder lastig maakt voor kwaadwillenden om aan je databasegegevens te komen.

    Vervolgens include je de database klasse en initialiseer je de database via een constructor waarin je de benodigde gegevens gelijk meegeeft. Deze gegevens sla je op in private variabelen van de klasse, aangezien de omgeving niet aan deze variabelen mag komen. Ook de "handle" die je noemt zal een private variabele zijn. Een voorbeeld (in pseudocode*):

    [code:1:402ff41103]// Laadt de database gegevens en laadt de klasse
    include($_SERVER["DOCUMENT_ROOT"]."/geheime_locatie/databasegegevens.php");
    include("classes/Database.class.php");

    // Initialiseert een nieuwe instantie van de Database-klasse
    $db = new Database("dbserver", "dbnaam", "dbgebruiker", "dbwachtwoord");

    // Nu kan je alles via $db doen
    $db->connect();
    $db->query("INSERT INTO bla VALUES('x','y');");
    $db->close();
    [/code:1:402ff41103]Het is dus de klasse zelf die met de gegevens verbinding maakt, daar heb je als gebruiker van de klasse de databasegegevens niet meer voor nodig. Je kan nu ook extra functionaliteit aan je klasse toevoegen, zoals bijvoorbeeld een teller die bijhoudt hoeveel queries je uitvoert vanaf initialisatie, maar ook kan je bijvoorbeeld queries eerst testen op betrouwbaarheid en door een (private) functie heengooien om database injection te voorkómen. Kortom, de mogelijkheden zijn legio.

    Waar het in ieder geval op neerkomt is het volgende: denk goed na over je klassen en zorg ervoor dat je ze in principe onafhankelijk en zelfvoorzienend maakt. Maak alle variabelen en methoden private. Private variabelen kan je aanpassen via een public function, mits je dit wil toestaan. Op die manier forceer je de gebruiker van de klasse (jezelf) om de klasse op de goede manier aan te roepen en wordt het op termijn heel overzichtelijk.

    Ik hoop dat dit je helpt.

    - Bas

    [size=9:402ff41103]*) Dit is geen echte pseudocode maar ik wil ermee aangeven dat er het nodige aan mankeert en dat het een benadering is van hoe je het moet programmeren.[/size:402ff41103]
  • [quote:357a03e67c="BasHamar"]Het is me niet helemaal duidelijk wat het probleem nou is…[/quote:357a03e67c]
    Maar gelukkig beantwoord je mijn vraag evengoed helemaal (en meer) :-)
    Het was ook een beetje een dubbelvraag die heel globaal neerkwam op: "Hoe weet de 'DB_close method' welke handle de 'DB_open method' heeft gebruikt (omdat hij deze handle nodig heeft om de verbinding te sluiten)?
    En aanvullend wat dan de beste manier was om dat te doen.
    Nou, het antwoord staat hierboven. Tnx!

    Snap ik eindelijk waar ik die private en protected variabelen voor kan gebruiken *grinnique*

    [edit]
    P.S.
    En wat ik ook maar meteen vroeg, was de mening over mijn keuze om het sluiten van de database ook middels een class/method te doen.
    Van de ene kant is de 'gangbare' code niet perse langer of ingewikkelder dan het aanroepen van een class/method voor deze klus:
    [code:1:357a03e67c]$DBhandling->close_DB();[/code:1:357a03e67c]
    Versus
    [code:1:357a03e67c]MySql_close ($DBconnection)[/code:1:357a03e67c]
    het aanroepen van de class neemt dus ongeveer netzoveel ruimte in als de aktie rechtstreeks uit te voeren.

    Maar toch gebruik ik een class om de database te sluiten omdat ik hem ook met een class heb geopend.
    [/edit]
  • Graag gedaan!

    Natuurlijk heb je gelijk dat het sluiten van de database in één regel via beide methoden even makkelijk en overzichtelijk is, maar als het goed is, is de verbinding niet op deze manier te verbreken van buiten de klasse:
    [code:1:d2b5be7e12]MySql_close ($DBconnection)[/code:1:d2b5be7e12]Je hebt namelijk helemaal geen toegang tot de private (!) variabele $DBconnection. ;)

    - Bas

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.