Kimmi: Funktionsrückgabe mit false und weiteren Angaben

Hallo Leute,

ist es möglich eine Funktion zu schreiben und dann bei return "false" und weitere Angaben ausgeben zu lassen, so dass die funktion einfach mit

  
if( funktion() ) {  
	// tu was  
}  

abgefragt, aber ggf. auch weiter differnziert werden kann?

Mit "true" ist das ja kein Problem, weil da ja jede Angabe die nicht "false" ist, "true" ist.
Ich bräuchte das nun aber umgekehrt...

Ich danke euch schon mal :)

  1. Tach!

    ist es möglich eine Funktion zu schreiben und dann bei return "false" und weitere Angaben ausgeben zu lassen,

    Du könntest in jedem Fall eine komplexe Datenstruktur zurückgeben und den Erfolgsstatus in einer der Eigenschaften ablegen. Dann müsstest du aber das Ergebnis zuerst in einer Variable ablegen und dann die betreffende Eigenschaft auswerten.

    if( funktion() ) {

    Selbst im Positiv-Fall brauchst du irgendeine Datenablage, mit der du dann weiterarbeiten kannst

    if ($ergebnis = funktion()) {  // tu was mit $ergebnis

    Da hast du dann eben eine Zeile mehr, was ja auch nicht wehtut.

    $ergebnis = funktion()
    if ($ergebnis->status) ...
    else ...

    Andererseits, wenn dich im Positiv-Fall kein Ergebnis interessiert, könntest dann auch null zurückgeben und im Fehlerfall deine komplexen Daten. Weiterhin gibt es da noch Exceptions, die ebenfalls im Fehlerfall beliebige Daten im Exception-Objekt transportieren können. Und zu guter Letzt kann man Ergebnisse auch über Referenz-Parameter zurückgeben, so wie es preg_match() mit den $matches macht.

    dedlfix.

    1. Dankeschön :)

      klar, die Funktion einfach umzudrehen und im Erfolgsfall false ausgeben :D
      Da hatte ich wohl wieder ein Brett vorm Kopf ...

      Jetzt hab ich aber nochmal eine Verständnissfrage:
      Was ist denn der Unterschied zwischen 0, Null und false?

      1. Hallo,

        Jetzt hab ich aber nochmal eine Verständnissfrage:

        aber bitte nicht mit Nissen.

        Was ist denn der Unterschied zwischen 0, Null und false?

        Oh, da sprichst du ein heißes Thema an: Datentypen und deren Unterscheidung in PHP. Um das Chaos komplett zu machen, nehmen wir noch den leeren String "" dazu.

        Alle diese Werte sind im volkstümlichen Sinn "nichts", aber eben verschiedene Typen von "nichts". Das ist in PHP so schwierig zu vermitteln, weil PHP die Datentypen automatisch umwandelt, wann immer es nötig ist. Deshalb ergeben auch alle diese Ausdrücke false, wenn sie in einem boolschen Kontext (z.B. in einer if-Anweisung) stehen.

        Es gibt aber Fälle, in denen man etwa zwischen dem numerischen Wert 0 und dem boolschen Wert false trotzdem unterscheiden möchte. Einige PHP-Funktionen geben nämlich im Erfolgsfall einen Zahlenwert zurück, der aber auch 0 sein kann, und im Fehlerfall ein boolsches false. In solchen Fällen reicht also die "einfache" if-Abfrage nicht.

        Beispiel 1:

        if (strpos($string, $id))  
         { // weitere Verarbeitung  
         }
        

        Dieses Beispiel versagt, wenn $id zwar gefunden wird, aber gleich am Anfang von $string. Dann ergibt strpos() nämlich 0, und das wird im boolschen Sinn von der if-Anweisung zu false umgewandelt. - Prima, denkt man sich, dann vergleiche ich halt mit false.

        Beispiel 2:

        if (strpos($string, $id)!=false)  
         { // weitere Verarbeitung  
         }
        

        Aber auch hier fallen wir in diesem Fall auf die Nase, nur dass die Verarbeitung einen Schritt komplizierter ist. Hier liefert strpos() im oben beschriebenen Fall auch 0, und der Vergleichsoperator != bringt, um den Vergleich durchführen zu können, erstmal beide Operanden auf denselebn Typ. Er wandelt also den zweiten Operanden false ebenso in den Zahlenwert 0 um, und stellt dann fest: Die Aussage 0!=0 ist nicht wahr, die Bedingung also nicht erfüllt.
        Aus dem Dilemma kommen wir nur heraus, wenn wir die automatische Typumwandlung beim Vergleich unterbinden.

        Beispiel 3:

        if (strpos($string, $id)!==false)  
         { // weitere Verarbeitung  
         }
        

        So wird ein Schuh draus: Wenn strpos() jetzt irgendeinen Zahlenwert liefert, dann gilt der schon deshlab als ungleich false, weil die Typen der Operanden nicht übereinstimmen, Zahlenwert ist immer ungleich Boolean. Der Operator für typsichere Prüfung auf Gleichheit ist übrigens === (drei Gleichheitszeichen).

        Was lernen wir daraus? Eine automatische Typumwandlung, wie PHP sie bei Bedarf durchführt, kann sehr bequem sein. Aber man muss in einigen Fällen höllisch aufpassen, dass man nicht auf die Nase fällt.

        So long,
         Martin

        --
        Einer aktuellen Erhebung zufolge sind zehn von neun Ehefrauen eifersüchtig auf ihren Mann.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. So?

      
    if( funktion() === false ) {  
     	// tu was  
    }  
    
    

    Das zumindest wird _nur_ ausgeführt, wenn der return false ist. Vielleicht habe ich Dich auch nicht verstanden.

    Generell hat mir bei dieser Art Entscheidungen immer diese Tabelle geholfen: Type comparison table. Ich arbeite auch gerne mit dem NULL Wert, und is_null(), was Dir vielleicht Denkanstöße gibt.

    Cheers,
    Baba