Vraag & Antwoord

Webprogrammeren & scripting

[OOPHP] Waarom maar een variabele terug uit een method?

10 antwoorden
  • Ik weet niet beter dan dat een method uit een PHP class slechts een variabele terug kan sturen. Nu heb ik regelmatig behoefte aan meer respons (voorbeeld: na een database query wil ik, 1: het resultaat van de query terug krijgen, 2: het aantal betrokken rows en 3: de status van de database) daarom maak ik steeds meer gebruik van een (associatieve) array als variabele om terug te geven. Maar ik krijg ook steeds meer het gevoel dat dat de bedoeling helemaal niet is. Misschien wil ik wel teveel tegelijk doen in mijn methods? Nu ken ik de reden niet waarom er maar een variabele teruggegeven kan/mag worden, dus misschien zit ik wel onbewust om de hele gedachtengang van classes heen te werken. Ik probeer de dingen de laatste tijd steeds meer uit elkaar te halen met de gedachte: "Een functie per method". Om bij het voorbeeld te blijven: Een public method die de data voor een query ontvangt en er een SQL query van bouwt. Deze roept op zijn beurt een private method aan om de database verbinding te openen Een andere private method om de query uit te voeren, en tenslotte een derde private method om de verbinding weer te sluiten. maar ook in dat geval wil ik uiteindelijk toch weer al die data terugkrijgen. Dus wat ik me afvraag is: Wat is nu eigebnlijk de reden dat er maar een variabele teruggestuurd kan worden uit een method, en wat kan ik beter doen?
  • Kun je geen array terugsturen?
  • Een nettere manier is om zelf een soort Response classe te make. Die vul je in de functie en geef je vervolgens terug. Daar staan dan dus al je gegevens in. Gr
  • [quote:e29972af22="gerben"]Kun je geen array terugsturen?[/quote:e29972af22] Ja, dat doe ik dus ook :-) [quote:e29972af22="yendis"]Een nettere manier is om zelf een soort Response classe te make. Die vul je in de functie en geef je vervolgens terug. Daar staan dan dus al je gegevens in. Gr[/quote:e29972af22] Da's inderdaad wel een nette oplossing, maar die zal zijn gegevens toch ook gewoon binnen moeten krijgen?
  • Even snelle reactie, ik heb haast, maar afhankelijk van wat je precies wil is dat ook prima te bereiken door parameters mee te geven "[url=http://www.php.net/manual/en/functions.arguments.php#functions.arguments.by-reference]by reference[/url]". Het staat redelijk duidelijk uitgelegd in de PHP manual. - Bas
  • Een algemene response class geeft niet veel voordelen boven alles wat je nodig hebt in een array stoppen. Via reference doorgeven is inderdaad een optie maar vind ik als nadeel hebben dat er dus dingen kunnen worden aangepast die je misschien helemaal niet aangepast wilt hebben. Een andere mogelijkheid, ook zeker niet de beste, is om voor elk respons een class te maken, in dit voorbeeld een DatabaseQueryResult. Je moet zorgen dat die klasse binnenkrijgt wat ie nodig heeft (bijv de gedane query en de pointer naar het resultaat en dbconnectie) en kan je dan alles geven wat je nodig hebt dmv methodes (getNextRow: haalt via de databaseconnectie en resultpointer de volgende rij op, kan ook via je aparte databaseklasse; getAffectedRows: idem; getDBStatus etc.). Waarom een functie maar een return-value kan hebben, ik weet het niet. Haskell bijv. ondersteunt meerdere return-values dmv tupels: (returnvalue1, returnvalue2) maar eigenlijk kan je ook dat zien als een resultaat'object' met daarin meerdere waarden. De door mij als 3e genoemde oplossing vind ik in zoverre mooi dat het heel duidelijk is wat je terugkrijgt en wat je er mee kan, nadeel is dat je veel extra moet programmeren, een array is dan inderdaad handiger.
  • Ik weet niet of dit in jouw model/structuur past. Op het MVC manier gaat het als volgt: Je maakt 2 Objecten aan die een andere Table Object extenden. Als voorbeeld: Class Article_Table extends Db_Table_Abstract Hier in definieer je alle methods waarbij een query naar de article table gemaakt moet worden (select, insert, etc). De row of rowset die je return moet dan als new Article object worden gereturn. Vervolgens heb je: Class Article extends Db_Table_Row_Abstract Hier maak bijvoorbeeld getId(), getTitle() etc methods aan De Db classes hebben dan hun eigen methods. Db_Table_Abstract heeft dan een aantal sql methods select() execute() of wat dan ook. en Db_Table_Row_Abstract heeft dan weer andere methods wat met een row te maken heeft. Ik hoop dat je het nog volgt, want ik volg het niet meer xD sorry
  • Zoals je al zegt: vaak kun je die ene functie die 2 dingen teruggeeft ook herschrijven naar 2 functies die 1 ding teruggeeft. Misschien moet je daarbij wel een nieuwe class introduceren. Je code wordt er vaak ook nog eens leesbaarder van. Het duidt ook meestal op een ondoorzichtig programma-ontwerp. Om op jouw geval terug te komen: als je nu een eigen "Query"-class maakt waarbij je in de constructor je databasequery doorgeeft waarop de methods zitten: "getRows", "getRowCount", "getDbStatus", o.i.d. Anonieme, tuple-achtige return-waarden zou ik alleen als laatste oplossing kiezen (bijvoorbeeld omwille van efficientie).
  • Een hele rits nuttige reakties,methodes en meningen. Daar ga ik eens op mijn gemak voor zitten, want veel balanceert net op de top van mijn OOP kennis (Ik ben er nog niet zo lang mee bezig), in de zin dat er vaak wel een belletje rinkelt en ik me er volgens mij ook wel wat bij voor kan stellen maar dat moet ik dan eerst nog even zeker weten :-) Het wordt een drukke week en een druk weekend, maar daarna leg ik de documentatie en mijn kennis eens naast de reakties en het lijkt me dat ik dan wel tot een voor mij goeie oplossing kan komen. En zo niet, dan is dat hier weer terug te lezen ;-)
  • Er is al veel gezegd maar hier is nog een mening: In het geval van je voorbeeld: * Je kan ook een connectie meegeven aan een query, php regelt dan het openen en sluiten van je connectie, maar dat is een implementatie dingetje 1) De methode om de query uit te voeren geeft de result data terug 2) Deze methode kan dan ook gelijk 2 properties van zijn eigen class zetten: DatabaseStatus, affectedRowsLastQuery 3) Deze kan je dan weer ophalen met getters. Als je meer dingen terug wilt geven moet je je afvragen of dit niet tot meerdere methodes hoort. In dit geval, wil je altijd maar de status van de database, wil je altijd weten hoeveel affected rows? Volgens mij kan je beiden al afleiden uit het resultaat. (Null = crash query/database en affectedrows is simpelweg een php count over het resultaat). Succes!

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

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