Funktionen PHP

  • Hey,


    ich habe mal paar fragen zu meinem script hier:



    Ich habe ja erstmal 2 zahlen in variablen erstellt. Dann habe ich die funktion gestartet und habe dieser variablen mitgegeben mit den werten 1 und 0.
    Nun kappier ich irgendwie nicht warum die function erst den error ausgibt wenn die var zahld = 3,33 ist , wenn $zahl2 = 0 ist.


    Villt täusche ich mich jetzt, aber kann es sein das die werte aus den beiden ersten vars :


    $zahls = 20;
    $zahld = 3.33;


    Die werte der variablen in der function überschreiben ?


    Und dann nochwas. Wenn ich jetzt in der funktion in der if else anweisung nun alles was er ausgeben soll reinschreibe un d nix auserhalb der funktion und ich dann die funktion mittels echo ausgeben möchte bleibt der leere Bildschirm warum denn ?
    Gruß,
    Stef

  • 1. Ich verstehe nicht hundertprozentig, was du meinst, aber es steht fest, dass deine zahls sowie zahld immer gleich zahl1 bzw. zahl2 ist, da die Werte ja der Funktion mitgegeben werden. Das sind keine unterschiedlichen Werte, es sind nur unterschiedliche Namen.


    Hinter den Variablen, die du in der Funktion deklariert hast (also zahl1 und zahl2), hast du dann noch ein default value zugewiesen. Die Variablen bekommen immer diesen Wert, wenn bei dem Start der Funktion keine Daten mitgegeben werden, indem man die Klammern einfach leer lässt.



    Also eigentlich müsste die Funktion immer den Fehler zurückgeben, wenn zahl2 bzw. zahld gleich 3.33 sind.


    Ansonsten hätte ich noch zwei Anmerkungen:


    1. Die Fehlermeldung solltest du am Besten in der Variable ergebnis speichern und zurückgeben, nicht sofort ausgeben.


    Dann könntest du beispielsweise den return value wie bisher entgegennehmen und dann aber abfragen, ob es sich bei dem Wert um einen String oder einen Integer handelt. Wenn es ein String ist, gibst du die Fehlermeldung, also Variable ergebnis einfach aus. Falls nicht und es ein Integer ist, kannst du deinen normalen Ergebnissatz ausgeben.


    Alternativ könntest du in der Funktion natürlich auch einfach false zurückgeben, wenn die Zahl gleich 3.33 ist und dann abfragen, ob die Funktion false zurückgegeben hat. Wenn dies zutrifft, gibst du deine Fehlermeldung aus.


    2. Die Return-Funktion schreibt man, glaube ich, ohne Klammern. Kann sein, dass beides möglich ist, bin mir da aber nicht sicher. Falls es auch so geht und du die Variante mit Klammern schöner findest, kannst du es natürlich auch einfach so lassen.



    Deine zweite Frage verstehe ich leider nicht...

  • Hey,


    aso ok. Habe ich mir gedacht. Wenn ich jetzt schon der function zahlen mitgebe vor dem funktionsstart damm braucht man doch nicht zahlen in der function zu schreiben ? Oder?


    PHP
    1. $zahls = 20;
    2. $zahld = 3.33;
    3. function zahlen ()
    4. {
    5. blablabla.......
    6. }


    Und wenn ich jetzt z.b. keine zahlen vordefiniere, dann zählen die Zahlen in der function.?


    PHP
    1. function zahlen ($zahl1 = 20,$zahl2= 2.33)


    Ok und wie macht man dass ? Tut man 2 gleichen variablen andere werte geben und dann abfragen ob wie du erwähnt hast es ein int oder string ist? Oder wie meinst dus jetzt ?


    Die 2.te frage hat sich erledigt.


    Gruß,
    Stef

  • Was dich hier verwirrt sind die Übergabewerte oder auch Parameter genannt, dabei geht es um die in den Klammern hinter dem Funktionsnamen angegebenen Variablen. Du hast von "überschreiben" gesprochen. Das ist genau das was passiert und was beabsichtigt ist.


    PHP
    1. function funktionsname($parameter1, $parameter2, ...)
    2. {
    3. }


    Funktionsparameter benötigt man immer dann, wenn man Daten, die außerhalb der Funktion erhoben werden, innerhalb verwenden will. In deinem Fall sind es 2 Zahlen. Diese Zahlen könnte man zum Beispiel über Eingabefelder vom Benutzer abfragen oder wie du es getan hast einfach so deklarieren.


    Ein Gleichheitszeichen brauchst du bei den Parametern grundsätzlich nicht, außer du möchtest Standardwerte nutzen. Das macht in deinem Fall hier absolut keinen Sinn. Ich komme gleich darauf zurück.


    Die Parameter setzt du nun nicht durch das Gleichheitszeichen, sondern indem du beim Funktionsaufruf in der gleichen Reihenfolge durch Kommata getrennt werte angibst. Dabei kann es sich um Variablen, Zahlen, Strings, Arrays, Objekte, etc. handeln:


    PHP
    1. function addieren($zahl1, $zahl2)
    2. {
    3. print $zahl1; // Gibt 5 aus
    4. print $zahl2; // Gibt 8 aus
    5. }
    6. addieren(5, 8);


    Wenn du nun im Funktionsaufruf (Zeile 7) zu wenig Parameter angibst, bekommst du Fehlermeldungen. Es werden 2 Parameter erwartet, gibst du nur einen an:


    PHP
    1. addieren(5);


    Erhältst du:


    Code
    1. Warning: Missing argument 2 for addieren()
    2. Notice: Undefined variable: zahl2


    Es wird angezeigt, dass beim Aufruf von addieren() das 2. Argument (Parameter) fehlt. Außerdem wird in der Funktion festgestellt, dass $zahl2 nicht definiert ist. Kann ja auch nicht, da der 2. Übergabewert fehlt.


    Für das nächste Beispiel wird die Funktion kurz umgeschrieben:


    PHP
    1. function addieren($zahl1, $zahl2)
    2. {
    3. $ergebnis = $zahl1 + $zahl2;
    4. print $ergebnis;
    5. }


    Jetzt gehen wir davon aus, dass wir in unserem Programmablauf die Funktion benötigen zu einer Zahl 2 hinzu zu addieren. Statt eine neue Funktion anzulegen, kann einfach die addieren Funktion benutzt werden. Dazu bekommt $zahl2 den Standardwert (default) 2 zugewiesen:


    PHP
    1. function addieren($zahl1, $zahl2 = 2)
    2. {
    3. $ergebnis = $zahl1 + $zahl2;
    4. print $ergebnis;
    5. }


    Diese Funktion kann jetzt mit nur einem Übergabewert aufgerufen werden:


    PHP
    1. addieren(5, 5); // Ausgabe: 10
    2. addieren(5, 2); // Ausgabe: 7
    3. addieren(5); // Ausgabe: 7


    Wenn du schon bein anlegen der Funktion keine Parameter angibst, bekommst du keine Daten in die Funktion hinein:


    PHP
    1. function addieren()
    2. {
    3. // Hier existiert keine Variable
    4. }


    Eine Ausnahme bilden globale Variablen, Auf die sollte man aber möglichst verzichten.


    Was @JR Cologne: meint ist, dass man in Funktionen nichts ausgeben lassen sollte (außer beim Debuggen). PHP ist eine typschwache Sprache, das bedeutet es ist egal welche Variablentypen verwendet werden. Eine Funktion kann also sowohl einen String als auch einen Integer zurückgeben. In deinem Fall würde ich das einfach so lösen:


  • Hey,


    vielen Dank für die ausführliche Erklärung habe es nun besser verstanden. :)


    Nun nochmals ne frage zu dem return.


    Wenn man in der funktion nichts ausgeben möchte. Dann kann man ja diese Strings returnen um außerhalb der function auf diese zugreifen zu können ?


    ___


    Man könnte ja diese funktion ohne function auch einfach so machen :



    Wofür sind dann die Funktionen gedacht ? Da kommt doch immer das selbe raus.


    Gruß,
    Stef

  • Es geht dabei um Redundanz. Redundanz bedeutet, dass identischer Code mehrfach vorkommt. Eine Funktion kannst du jederzeit wieder aufrufen, anstatt den Code einfach zu kopieren.


    Einfach mal 3 Aufrufe vergleichen.


    Mit Funktion:



    Ohne Funktion:



    Bei kleineren Funktionen wie dieser fällt es nicht so extrem auf, daher habe ich hier mal die sort Funktion für Arrays nachgebaut um die Einfachheit zu verdeutlichen:


  • Hey,


    danke für die 3 unterschiedlichen Veranschaulichungen. Man sieht direkt das funtcionen besser sind.


    1. Weniger script.
    2. übersichtlicher
    3. Mann kann eine für mehrere Sachen nutzen


    Könntest du mir bitte deine geschrieben function erklären ? Wäre echt gut.


    Gruß,
    Stef

  • Ein weiterer Punkt ist einfach, dass man Funktionen auch einfach in seperate Dateien auslagern und somit zusammenhalten kann. So findet man sie schnell wieder und braucht nicht jedes mal den kompletten Programmablauf lesen bis man sie findet.


    Meinst du die Sortierfunktion?


  • Meine Fragen:


    1. Warum steht vor $array ein & ?
    2. Was hat $desc = false für ein Nutzen?
    3. Warum hast du in einer for schleife noch eine for schleife ?
    4. Mit $i/$j < sizeof($array) tust du ja alle daten im array sammeln ?
    5. Bei der 2. for-schleife beim if-statement:


    ist diese Beschreibung richtig so ?
    6. Hast du 2 Arrays gemacht für klein zu groß und groß zu klein ?

  • 1. Warum steht vor $array ein & ?


    Wir hatten weiter oben ja schon geklärt, dass beim Übergeben einer Variable an eine Funktion eine zweite Variable für die Verwendung in der Funktion erstellt wird (in Zeile 11 anfangen zu lesen):



    Durch das anlegen einer Kopie wird der Speicherbedarf für die entsprechende Variable verdoppelt. Außerdem haben Änderungen an $variable keinen Einfluss auf $text.


    Mit dem kaufmännischen Und vor dem Parameter wird jetzt keine Kopie von der übergebenen Variable erstellt, sondern es wird mit einer Referenz auf diese gearbeitet. Das ist programmiertechnisch etwas umständlicher, bietet im Zusammenhang mit Arrays aber 2 Vorteile:


    1. Es wird keine Kopie angelegt, bei sehr großen Daten (riesige Arrays z. B.) spart das viel Speicher
    2. Änderungen am Array betreffen trotzdem das Original


    Das ist auch oft eine Stolperfalle für Anfänger bei der forech Schleife. Mit der foreach Schleife kann man ein Array durchlaufen. Wenn man nun in der Schleife selbst auf jedes Element des Arrays z. B. strtoupper anwendet um alle Zeichen in Großbuchstaben zu ändern und das Array nach der Schleife verwendet, hat sich nichts geändert. Auch hier braucht man &.


    Ist jedoch nicht ganz einfach zu verstehen und in typschwachen und hardwarefernen Sprachen wie PHP und JS braucht man das äußerst selten.


    2. Was hat $desc = false für ein Nutzen?


    Du siehst die Verwendung in Zeile 9 und 10 der Funktion. Anhand der Variable wird lediglich entschieden ob aufsteigend oder absteigend sortiert wird. Das siehst du auch am Ergebnis wenn true mit übergeben wird (siehe oben):


    PHP
    1. sort_array($array1);
    2. print_r($array1); // 1, 3, 5, 7, 8, 19, 27
    3. sort_array($array1, true);
    4. print_r($array1); // 27, 19, 8, 7, 5, 3, 1


    3. Warum hast du in einer for schleife noch eine for schleife ?


    Das ist ein einfacher Algorithmus zur Sortierung (Selection Sort). Ich versuche das mal grob zu erklären.


    Die erste Schleife fängt beim 1. Element an. Dann wird direkt die zweite Schleife gestartet. Diese fängt jetzt beim n+1-ten Element an, also bei 2, arbeitet sich durch alle verbleibenden Elemente und vergleicht das 1. mit dem aktuellen. Wenn das aktuelle Element dann kleiner (oder bei umgekehrter Reihenfolge größer) ist, wird es mit dem an der ersten Stelle getauscht. Wir können dann sicher sein, dass das erste Element das kleinste Vorkommen beinhaltet. Dann endet die 2. Schleife und die 1. springt zum zweiten Element über. So geht das weiter bis zum Schluss.


    Oder einfach die Schritte für das gegebene Element. Das + zeigt die Position der ersten Schleife und das - die der zweiten. Es wird aufsteigend sortiert.



    4. Mit $i/$j < sizeof($array) tust du ja alle daten im array sammeln ?


    sizeof gibt mir die Anzahl der Elemente im Array. Wenn also die Zähl-Variable $i (in der 2. Schleife $j) die Anzahl der Elemente im Array erreicht, ist die Schleife beendet.


    5. Bei der 2. for-schleife beim if-statement [...]


    Fast. Hier findet der oben beschriebene Tausch statt. Weil man leider nicht einfach sagen kann $array[$i] soll jetzt $array[$j] beinhalten und umgekehrt, muss zwischendurch eine temporäre Variable (daher $tmp) angelegt werden um sich einen Wert zu merken. Das sieht vom Ablauf dann so aus:



    6. Hast du 2 Arrays gemacht für klein zu groß und groß zu klein ?


    Nein. Ich habe eins mit Integern und eins mit Strings erstellt. Dann das Integer-Array aufsteigend sortieren und ausgeben lassen, dann das aufsteigend sortierte Integer-Array absteigend sortieren und anzeigen lassen und dann das String-Array aufsteigend sortieren und anzeigen lassen.


    Hoffentlich konnte ich alles verständlich rüberbringen :) Ansonsten frag weiter nach, der beste Weg sich zu entwickeln!

  • Hey,


    erstmals wirklich ein großes Dankeschön. Habe jetzt einiges mehr verstanden. Nehme mir aber noch ein paar Tage um alles zu testen. Habe mich dabei dann gleich versucht. Habe so ne Funktion zum sortieren nachgebaut.
    Wenn ich das & vor der $arr weg lasse wird nix sortiert.




    Kennst du paar Seiten wo die Algorythmen in PHP ausführlich/leicht zu verstehen erklären ? Bin grad auf der suche aber finde fast nix.
    stef

  • So merkwürdig es klingen mag, so hat Algorithmik erstmal nicht viel mit irgendeiner Programmier- oder Skriptsprache zu tun. Viel mehr ist es die logische und mathematische Herangehensweise ein Problem zu lösen. Das dann in einer bestimmten Sprache umsetzen ist einem meistens selbst die Aufgabe. Der komplizierte Part ist also nicht PHP sondern die Logik des Ablaufes. Wenn die klar ist, kann man mit etwas Erfahrung in einer Sprache recht einfach damit arbeiten.


    Glücklicherweise muss man das alles aber auch so gut wie nie. Die meisten und wichtigsten Algorithmen werden in Standard-Bibliotheken zur Verfügung gestellt. So auch etliche Sortieralgorithmen für Arrays in PHP (siehe hier).


    Ich kenne leider auch keine größere Sammlung oder Aufbereitung verschiedener Algorithmen. Man muss immer irgendwie Ausschau halten nach dem was man gerade sucht. Wikipedia kann da oft helfen (auch wenn es teils unnötig kompliziert ist).

  • Hey,


    ok. Schade das es nicht so viele gibt. Dann halte ich mal Ausschau.


    BTW: zu dem & vor den parametern.


    Habe dann noch ne funktion erstellt wo jedes kleine Wort groß gemacht wird und jedes große klein gemacht wird,
    aber dies funktioniert auch nur mit & vor der var array. Warum denn
    das?



    Diese funktionen könnte man jetzt sozusagen überall anwenden ? Man brauch dann nur noch funktionsname mit variable schreiben wo die funktion erfolgen soll ?


    Gruß,
    Stef

  • Weil, wie bereits erklärt, das & dafür sorgt, dass in deinem Fall die Änderungen an $texte vorgenommen werden, weil $array nur auf $texte verweist. Wenn du das & weglässt verweist $array nicht auf $texte und die Funktion ändert zwar $array aber nicht $texte. Ohne & müsstest du wieder mit einem Rückgabewert arbeiten.

  • Return ist das Gegenstück zu den Parametern. Mit den Parametern gibst du Variablen in die Funktion hinein, mit return wieder raus: