functie overload

Status
Niet open voor verdere reacties.

SmartThinker

Gebruiker
Lid geworden
15 mei 2013
Berichten
241
Ik krijg het in PHP niet voor elkaar om een functie te kunnen overload.

Ik heb een stukje code die een functie aanroept met de 2 opties: Of het gaat alleen om het object, of er wordt nog wat meegegeven.
Omdat een functie nogal streng is met de hoeveelheid atrributen kan ik in vb de volgende truuk uithalen:

function DoHet(object)
Dohet(object, "")
End Function

function DoHet(object, extra)
'doe mijn ding
End function


Nu doe ik dus net zo iets in PHP:

function DoHet($object){
Dohet($object, "");
}
function DoHet($object, $extra){
//doe mijn ding
}
En nu begint de compiler te piepen.
mag dit niet in PHP?
Is er een alternatief?

M.
 
Dit bestaat niet in PHP. Elke functie kan in principe met elke hoeveelheid argumenten aangeroepen worden. Vanwege dit principe hebben functies geen verschil voor de compiler aan de hand van de argumenten.

Je kunt het wel bereiken door het aantal argumenten naar de hoofdroutine te bekijken en dan gebaseerd daarop 2 verschillende interne functies aan te roepen
 
Je kunt parameters optioneel maken door ze een standaard waarde mee te geven:
PHP:
function DoHet($object, $extra = array())
{

}
Vervolgens zou je dan binnen de functie kunnen controleren op de waarde van de variabele.
 
Als ik dus routine :

function DoHet($Object, $extra = ""){
//doe iets
}

heb
en ik roep hem zo aan: Dohet(Object) dan zou het werken?
mmm gelijk proberen.....

Werkt. Vind het alleen weer jammer dat PHP als enige weer een eigen manier heeft gemaakt voor dit soort standaarden.
Maar belangrijkste: WERKT!
 
Laatst bewerkt door een moderator:
IS niet uniek hoor. VBA (ook van microsoft en gebaseerd nota bene op VB) werkt op exact dezelfde manier. Voor scripting talen (zoals php en vba) is dit beter en veiliger te interpreteren en uit te voeren.
 
Maar belangrijkste: WERKT!

Let wel op dat je nu dus niet kunt herkennen of een parameter wel of niet is meegegeven, terwijl dat het bestaansrecht van overloading is. Het is wellicht beter of in ieder geval functioneler om geen wisselende set parameters mee te geven, maar instantie van een extent op een soort parameterobject. Dan kun je in dat object afdwingen dat het altijd een bepaalde set gegevens moet bevatten en hoeft de aangeroepen functie alleen te controleren of hij een instantie van een parentobject meekrijgt.
 
bekijk onderstaandde eens
PHP:
<?php
class test{ 
       function __construct() {
             $argv = func_get_args();
             switch( func_num_args() ) {
                 case 1:     self::__construct1($argv[0]);           break;
                 case 2:     self::__construct3($argv[0],$argv[1]);  break;
                 case 3:     self::__construct3($argv[0],$argv[1],$argv[2]);break;
                 case 4:     self::__construct4($argv[0],$argv[1],$argv[2],$argv[3]);
             }
         }
         function __construct1($arg1){
         }
         function __construct3($arg1,$arg2,$debug = false){
         }
}
?>
 
Laatst bewerkt:
Dat is een (erg) hele ingewikkelde manier om de bestaande niet-verplichte parameters te implementeren.

Van de gebruiker uit gezien doet elke functie met dezelfde naam hetzelfde, het aantal parameters geeft alleen aan hoeveel details je aan de functie meegeeft. De functie gaat niet wezenlijk iets anders doen omdat je de tweede parameter niet hebt meegegeven.
Bij gevolg zullen de implementaties van __construct1() en constuct3() dus ook vrijwel identiek zijn, alleen zal __consrtuct1() de twee parameters die hij niet meekrijgt invullen met een default waarde, exact zoals PHP dat zelf al doestaat.

Als je overloading wilt simuleren dan moet je op datatype controleren, want dan maakt het uit of je de "createCustomer" method aanroept met een instantie van een customer object, een array met customer data of een stuk XML/JSON. Wederom blijft de werking van de method hetzelfde naar de gebruiker toe, evenals het aantal parameters.

Maar overloading is uberhaupt iets wat niet altijd even handig is, als je methods echt iets aparts doen als er andere parameters worden meegegeven dan is het meestal beter om er aparte methods van te maken met aparte namen.
 
ik heb natuurlijk in mijn voorbeeld een simpel voorbeeld van de waarheid weergegeven. Waar ik het bijvoorbeeld voor gebruik is dat ik een routine html schermen laat maken. De css en js wordt daar standaard door de template manager afgehandeld. maar soms wil ik extra opties meegeven die maar heel af en toe voorkomen. en die ook een aantal acties vereisen voor ze in de standaard routine geschoten kunnen worden. (denk hierbij aan het ophalen van een XML file waar data uit komt die in de hoofd routine geschoten moet worden).
Het is natuurlijk onzin om in de standaard opmaak constant de server te belasten met het afchecken van zaken die af en toe voorkomen. Met overload kan ik dus mooi een schil over een bestaand routine gooien zonder dat de originele routine belast. In vb werk ik net als met java. Je roept een routine aan met de juiste hoeveelheid argumenten en je reserveert elke var voordat je gewoon data gaat gooien in namen die nog niet bestaan (zoals we dat vroeger deden). Ik merk omdat ik gewend ben met classes in java en .net te werken dat ik daar toch weer op over stap. Leuk dat php, maar niet voor mij, als het serieus wordt.
 
Met overload kan ik dus mooi een schil over een bestaand routine gooien zonder dat de originele routine belast.

Ah zo, en dan gebruik je overloading als alternatief voor een handjevol IF statements. In JAVA zou ik zeggen: ja natuurlijk, in PHP kan het niet, dus dat lost je probleem direct voor je op. Je kunt doen wat kenikavanbis doet, maar of je code daar leesbaardere van wordt...



In vb werk ik net als met java. Je roept een routine aan met de juiste hoeveelheid argumenten

En vooral: de juiste typen. Het aantal argumtenten lijkt mij niet de juiste manier om overloading op te baseren, maar wie ben ik :-)


Leuk dat php, maar niet voor mij, als het serieus wordt.

100% mee eens, PHP is goed in waar het voor bedoeld is: snel een website opzetten met grote keuze in functionaliteiten, maar een goed beheerbaar efficient stuk applicatie neerzetten is echt een kunst in PHP.
 
als ik met dezelfde hoeveelheid argumenten verschillende type ga hanteren dan moet je heel strikt programmeren en kan het zijn dat een junior developer dat even mist. Tellen kunnen ze wel, maar lezen is wat lastiger.....
Ik heb niet voldoende ervaring met php om te weten of een aanroep wordt genegeerd in php als je het verkeerde type meegeeft.
Das stel dat je een functie type cast op int en je stuurt een string argument of hij dan crashed of null object pakt.
Iemand wel?
M.
@PgVincent: Waar voor mij nu de uitdaging in zit is om met een website bezig te zijn die gebruik maakt van C## in de vorm van DLL files. Daar zitten dan nog een paar DLL files bij die vanuit PHP worden aangeroepen. en dan een site die een mix is van HTML/XML/Javascrip/PHP/ASP.NET af en toe heel verwarrend.

Misschien is dit niet de goed plek maar zou ik een vb.asp routine kunnen schrijven. Die compileren tot .dll en dan vanuit php aanroepen. Dan stop ik namelijk al de overload stuff in de dll files. Iemand ervaring?
 
als ik met dezelfde hoeveelheid argumenten verschillende type ga hanteren dan moet je heel strikt programmeren en kan het zijn dat een junior developer dat even mist. Tellen kunnen ze wel, maar lezen is wat lastiger.....

Het doel van overloading is volgens mij ook juist om de method zo te maken dat je niet vast zit aan "parameter 1 moet een integer zijn en parameter 2 moet een string zijn". Ik heb constructors waaraan ik een instantie van een userclass mee kan geven, of een userid. Als de instantie wordt meegegeven dan wordt daar het userid uit opgehaald.


Ik denk dat het ook wel verstandig is om onderscheid te maken in de aanpakken; PHP heeft geen manier om een vast aantal paramers af te dwingen en ergo heeft het geen echte overloading.
JAVA heeft wel echte overloading en om dat werkend te krijgen mag het aantal parameters niet variabel zijn.
De twee sluiten elkaar uit.


Ik heb niet voldoende ervaring met php om te weten of een aanroep wordt genegeerd in php als je het verkeerde type meegeeft.
Das stel dat je een functie type cast op int en je stuurt een string argument of hij dan crashed of null object pakt.

PHP kent alleen typehinting met objecten, je kunt definieren dat een parameter een instantie van een bepaalde class of interface moet zijn, maar niet dat een parameter een string of integer moet zijn. Het is echt aan de programmeur om dat te controleren.
Daarbij komt dat PHP geen harde typing heeft, dus dit is foutloos PHP:
$a = new user();
$a=2;
echo $a+5;
en het print 7.


Misschien is dit niet de goed plek maar zou ik een vb.asp routine kunnen schrijven. Die compileren tot .dll en dan vanuit php aanroepen. Dan stop ik namelijk al de overload stuff in de dll files. Iemand ervaring?

Als het overloading gedeelte zo belangrijk is zou dat kunnen, maar dan vraag ik me ook weer af waarom je nog PHP er tussen houdt; doe het dan gewoon allemaal in ASP.
 
ik heb veel te maken met junior programmeurs die niet de tijd willen steken in het leren van vb. Doen alles in PHP. Omdat ik die hulp ingeschakel heb ik dus een beperking. Vandaar dat het een mix is van. Ik maak veelal het aspx gedeelte en een beetje PHP. Het PHP gros komt er dan van hun bij. Heb jij ervaring in het aanroepen van routines in php uit een dll die niet gemaakt zijn in php
M.
 
Klinkt logisch. Ik heb geen ervaring met eigen DLL's, los van dat ik niet op windows werk (ik doe ook niets met so's)
 
ik heb veel te maken met junior programmeurs die niet de tijd willen steken in het leren van vb. Doen alles in PHP. Omdat ik die hulp ingeschakel heb ik dus een beperking. Vandaar dat het een mix is van. Ik maak veelal het aspx gedeelte en een beetje PHP. Het PHP gros komt er dan van hun bij. Heb jij ervaring in het aanroepen van routines in php uit een dll die niet gemaakt zijn in php
M.
PHP gebruik je net omdat het sneller programmeert dan elke ander taal waar je éérst nog warm water moet uitvinden voor het te gebruiken .
PHP heeft een reputatie zoek het op internet en meestal is het al eens gemaakt en kan je op iets verderbouwen, vb is geen volwaardige taal en aspx al eens bekeken maar dan gebruik je beter java. .net totaal nuteloze taal in mijn ogen.
java zeer strikte taal en php een zeer losse taal alles kan en mag wat wel tot vuile code kan resulteren (door vele niet hoge opleidingen er in ) maar weet php is de laaste 4 jaar echt in niveau naar omhoog gegaan op vlakt van stuctuur .Dus om terug tekomen asp is kant nog wall dus een beetje los een beetje vast dus niet uitgesproken taal en bijgevolg voor mij niet bruikbaar.
maar php heeft een verleden van zeer gemakelijk aan te leren dus houden zo zou ik zeggen snel resultaat

En overloading zal niet snel komen denk ik aangezien dat net het gemak van de taal zou verminderen en de taal laat het eigenlijk niet toe dit te doen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan