Wo landen Rueckgabewerte?

Wo landen Rueckgabewerte?

am 21.06.2006 14:57:18 von unknown

Hallo Leute,

Funktionen liefern Werte zurück. Oder auch nicht.
Wenn ich schreibe:
function test {
}
$wert = test();
echo $wert;
Dann gibt das keine Fehlermeldung. Hier hat Er also einen Wert erlogen.
Würde meine Funktion ein 'return "mist"' enthalten, dann kann ich aber
genau so gut auf die Auswertung verzichten:
test();
Ich möchte wissen auf welchem Haufen ;) der Rückgabewert landet.
Schlimmer noch:
flock($datei, 1) or die("Kann nicht...
verknüpft Ergebnisse auf für mich nicht nachvollziehbare Weise.
Und ich weiß nicht, wie ich hilfreiche Lektüre finden kann.

MfG
hjs

Re: Wo landen Rueckgabewerte?

am 21.06.2006 15:15:46 von Frank Schenk

Hans-Jürgen Schneider wrote:
> Hallo Leute,
>
> Funktionen liefern Werte zurück. Oder auch nicht.
> Wenn ich schreibe:
> function test {
> }
> $wert = test();
> echo $wert;
> Dann gibt das keine Fehlermeldung. Hier hat Er also einen Wert erlogen.

Ists denn wirklich zuviel verlangt, mal ins Handbuch zu schauen?
http://de3.php.net/manual/en/language.functions.php

Aus den User Contributed Notes:
If a user-defined function does not explicitly return a value, then it
will return NULL. For most truth tests, this can be considered as FALSE.

Lässt sich auch einfach verifizieren.


> test();
> Ich möchte wissen auf welchem Haufen ;) der Rückgabewert landet.

Da du ihn nicht zuweist landet er nirgendwo.

> Schlimmer noch:
> flock($datei, 1) or die("Kann nicht...
> verknüpft Ergebnisse auf für mich nicht nachvollziehbare Weise.
> Und ich weiß nicht, wie ich hilfreiche Lektüre finden kann.

RTFM?

http://de3.php.net/manual/en/function.flock.php
flock -- Portable advisory file locking
Description
bool flock ( resource handle, int operation [, int &wouldblock] )

Danke für die ausführliche Recherche vor dem Posten, siehe auch:

How To Ask Questions The Smart Way
http://www.catb.org/~esr/faqs/smart-questions.html



gruß, Frank

Re: Wo landen Rueckgabewerte?

am 21.06.2006 16:11:38 von unknown

Frank Schenk schrieb:

> > Dann gibt das keine Fehlermeldung. Hier hat Er also einen Wert erlogen.

> If a user-defined function does not explicitly return a value, then it
> will return NULL. For most truth tests, this can be considered as FALSE.

Das hab ich wirklich übersehen.

> > test();
> > Ich möchte wissen auf welchem Haufen ;) der Rückgabewert landet.
>
> Da du ihn nicht zuweist landet er nirgendwo.

Das bestätigt voll meine Vermutung.

> > Schlimmer noch:
> > flock($datei, 1) or die("Kann nicht...
> > verknüpft Ergebnisse auf für mich nicht nachvollziehbare Weise.
> > Und ich weiß nicht, wie ich hilfreiche Lektüre finden kann.
>
> RTFM?
>
> http://de3.php.net/manual/en/function.flock.php
> flock -- Portable advisory file locking
> Description
> bool flock ( resource handle, int operation [, int &wouldblock] )
> Danke für die ausführliche Recherche vor dem Posten,

Bitte entschuldige, dass meine Frage nicht zu Deiner Antwort passt.

MfG
hjs

Re: Wo landen Rueckgabewerte?

am 21.06.2006 18:36:44 von Ulf Kadner

Hans-Jürgen Schneider wrote:

> Frank Schenk schrieb:
>>RTFM?
>>
>>http://de3.php.net/manual/en/function.flock.php
>>flock -- Portable advisory file locking
>>Description
>>bool flock ( resource handle, int operation [, int &wouldblock] )
>>Danke für die ausführliche Recherche vor dem Posten,
>
>
> Bitte entschuldige, dass meine Frage nicht zu Deiner Antwort passt.

Du meinst sicherlich das Du den Zusammenhang nicht verstanden hast! :-)

In der Definition steht doch das bool zurueck gegeben wird. Ist jetzt
der Groschen gefallen?

MfG, Ulf

Re: Wo landen Rueckgabewerte?

am 22.06.2006 08:05:22 von unknown

Ulf Kadner schrieb:
>
> Hans-Jürgen Schneider wrote:
> >>>flock($datei, 1) or die("Kann nicht...

> > Frank Schenk schrieb:
> >>bool flock ( resource handle, int operation [, int &wouldblock] )

> Du meinst sicherlich das Du den Zusammenhang nicht verstanden hast! :-)

Ich meinte obige Zeile (hab's nochmal reinkopiert).
"flock()" liefert einen Wert und "die()" auch. Beide werden oderverknüpft
und das Ergebnis dann weggeworfen.
Jetzt hat es den Anschein, dass die Zeile von links nach rechts ausgeführt
wird und sich die Sache im Falle von "true" _und_ "or" einfach erledigt
hat,
egal was danach noch kommt. Der Sinn wird wohl sein, dass jede weitere
Aktion reine Zeitverschwendung ist.
Irgendwie hatte ich mir aber vorgestellt, dass erstmal alle Argumente
eingesammelt werden, um sie im Anschluss dann entsprechend der Regeln
zu verknüpfen.

MfG
hjs

Re: Wo landen Rueckgabewerte?

am 22.06.2006 09:21:00 von Matthias Wuebbeling

Hans-Jürgen Schneider wrote:

> Ich meinte obige Zeile (hab's nochmal reinkopiert).
> "flock()" liefert einen Wert und "die()" auch. Beide werden oderverknüpft
> und das Ergebnis dann weggeworfen.
> Jetzt hat es den Anschein, dass die Zeile von links nach rechts ausgeführt
> wird und sich die Sache im Falle von "true" _und_ "or" einfach erledigt
> hat,
> egal was danach noch kommt. Der Sinn wird wohl sein, dass jede weitere
> Aktion reine Zeitverschwendung ist.
> Irgendwie hatte ich mir aber vorgestellt, dass erstmal alle Argumente
> eingesammelt werden, um sie im Anschluss dann entsprechend der Regeln
> zu verknüpfen.

Hierbei handelt es sich um eine Fehlerbehandlung. Du kannst statt die()
auch einfach

print "Datei konnte nicht gesperrt werden"

ausgeben. Dann wird nicht gestorben, sondern vielleicht nochmal ein lock
versucht.

Wenn ich mich an meine Logik Vorlesung erinner, dann ist es doch so,
dass bei einem "oder" nur ein Wert true sein muss, damit es der Ausdruck
auch ist. Also wäre es reine Zeitverschwendung, den zweiten noch zu prüfen.

Es wird also nur der zweite Wert benötigt, wenn der erste false ist.
Darauf basiert diese Fehlerbehandlung.

Wenn du beide Bedingungen mit und verknüpfen willst, kannst du die
gleichen Probleme bekommen.

Es gilt (A || B) = !(!A && !B)

In dem Fall wird !A den Wert false haben. Warum sollte php nun überhaupt
noch B ansehen, der Ausdruck in den Klammern ist eh false. Also wird der
gesamte Ausdruck wahr und die zweite Bedingung nicht geprüft.

Wenn du erst alles "einsammeln" willst bietet sich folgendes an:

$a = aktionA();
$b = aktionB();
$c = aktionC();

if(a || b || b) ....

HTH, lieben Gruß,
Matze

Re: Wo landen Rueckgabewerte?

am 22.06.2006 09:31:29 von Carsten Wiedmann

Hans-Jürgen Schneider schrieb:

> Ulf Kadner schrieb:
> >
> > Hans-Jürgen Schneider wrote:
> > > > > flock($datei, 1) or die("Kann nicht...
>
> > > Frank Schenk schrieb:
> > > > bool flock ( resource handle, int operation [, int &wouldblock] )
>
> > Du meinst sicherlich das Du den Zusammenhang nicht verstanden hast! :-)
>
> Ich meinte obige Zeile (hab's nochmal reinkopiert).
> "flock()" liefert einen Wert und "die()" auch. Beide werden oderverknüpft
> und das Ergebnis dann weggeworfen.


Da die() im Manual mit "void" definiert ist, würde ich nicht drauf Wetten
das es einen Wert zurückliefert...


> Jetzt hat es den Anschein, dass die Zeile von links nach rechts
> ausgeführt wird und sich die Sache im Falle von "true" _und_ "or"
> einfach erledigt hat,

Es hat ja nicht nur den Anschein, steht ja im Manual, dass "or" von links
nach rechts ausgewertet wird. Wenn's links vom "or" true ist (flock konnte
ohne Fehler ausgeführt werden), muss man rechts davon nicht mehr
weitermachen (muss ja nur ein Operant true haben). Und wenn's links false
ist, muss man schauen wie es rechts davon weitergeht. Hier muss dazu die
Funktion (besser das Sprachkonstrukt) die() ausgeführt werden, was zum
Abbruch des Scriptes führt.


> egal was danach noch kommt. Der Sinn wird wohl sein, dass jede weitere
> Aktion reine Zeitverschwendung ist.

Sozusagen. Warum soll man mit einer sinnlosen Aktion (Rechen-)Zeit
vergeuden. --> Das Ergebnis stand ja schon beim ersten "true" fest.
(Menschliche Neugierde was wohl trotzdem noch kommen könnte kennt ein
Computer nicht ;-)


> Irgendwie hatte ich mir aber vorgestellt, dass erstmal alle Argumente
> eingesammelt werden, um sie im Anschluss dann entsprechend der Regeln
> zu verknüpfen.

Mal ein Auszug aus dem ANSI-C Standard:
| The || operator guarantees left-to-right evaluation; there is a sequence
| point after the evaluation of the first operand. If the first operand
| compares unequal to 0, the second operand is not evaluated.


Vielleicht mal andersrum, was dir evtl. bekannter vorkommt. Erst einmal was
ANSI-C zu "and &&" sagt:
| The && operator guarantees left-to-right evaluation; there is a sequence
| point after the evaluation of the first operand. If the first operand
| compares equal to 0, the second operand is not evaluated.

Wird dann in PHP z.B. so öfters verwendet:
| if (isset($_GET['foo']) && ($_GET['foo'] == 'bar')) { ... }

(Den ErrorLevel "E_ALL" kennst du ? ;-)

Gruß
Carsten

Re: Wo landen Rueckgabewerte?

am 22.06.2006 11:37:12 von unknown

Carsten Wiedmann schrieb:

> Mal ein Auszug aus dem ANSI-C Standard:
> | The || operator guarantees left-to-right evaluation; there is a sequence
> | point after the evaluation of the first operand. If the first operand
> | compares unequal to 0, the second operand is not evaluated.

Genau das ist es, was ich nicht wusste und nicht gefunden hatte.

> Wird dann in PHP z.B. so öfters verwendet:
> | if (isset($_GET['foo']) && ($_GET['foo'] == 'bar')) { ... }

Damit wird mir sowas jetzt verständlich.

> (Den ErrorLevel "E_ALL" kennst du ? ;-)

Ja. Aber der ist hier gar nicht sehr geschwätzig.

MfG
hjs

Re: Wo landen Rueckgabewerte?

am 22.06.2006 11:38:57 von Frank Schenk

Hans-Jürgen Schneider wrote:
> Frank Schenk schrieb:

>>Da du ihn nicht zuweist landet er nirgendwo.
>
> Das bestätigt voll meine Vermutung.

Welche Vermutung? Wir schreiben hier von definiertem Verhalten von PHP
das in der Dokumentation dokumentiert ist.

> Bitte entschuldige, dass meine Frage nicht zu Deiner Antwort passt.

Warum folgst du nicht dem Link und schaust dir an, was flock zurückgibt?

(expr) or die('foobar);

ist die Kurzform von

if(!expr){
die('foobar');
}

In diesem Fall:

if(!flock(...)){
// couldn' lock
die('foobar');
}

Boolsche Algebra sollte klar sein (falls nicht bitte nachlesen), warum
und wie "expr or die();" funktioniert wurde dir ja schon erklärt.

Steht aber alles im Handbuch inkl. Beispielen, Erklärungen und Kommentaren.

Frank

Re: Wo landen Rueckgabewerte?

am 22.06.2006 11:43:41 von unknown

Matthias Wuebbeling schrieb:

> Es wird also nur der zweite Wert benötigt, wenn der erste false ist.
> Darauf basiert diese Fehlerbehandlung.

Hab's kapiert.

> Wenn du erst alles "einsammeln" willst bietet sich folgendes an:

Nein, lieber nicht. Ich konnte mir nur einfach nicht erklären, wie
sowas funktioniert.

MfG
hjs

Re: Wo landen Rueckgabewerte?

am 22.06.2006 11:57:33 von Carsten Wiedmann

Hans-Jürgen Schneider schrieb:

> Carsten Wiedmann schrieb:
>
> > Wird dann in PHP z.B. so öfters verwendet:
> > > if (isset($_GET['foo']) && ($_GET['foo'] == 'bar')) { ... }
>
> Damit wird mir sowas jetzt verständlich.
>
> > (Den ErrorLevel "E_ALL" kennst du ? ;-)
>
> Ja. Aber der ist hier gar nicht sehr geschwätzig.

Man könnte jetzt sagen: eben ;-), weil die Überprüfung wie erwartet am "&&"
aufhört oder nicht.

Ruf doch einfach mal dieses Script ohne den QueryString auf. Und du siehst
.... nichts. Jetzt änderst du den Code wie es viele machen:
| if ($_GET['foo'] == 'bar') { ... }
und rufst das Script wieder ohne QueryString auf...

Gruß
Carsten

Re: Wo landen Rueckgabewerte?

am 22.06.2006 13:26:19 von Alexander Falk

Hans-Jürgen Schneider schrieb:
> Hallo Leute,
>
> Funktionen liefern Werte zurück. Oder auch nicht.
> Wenn ich schreibe:
> function test {
> }
> $wert = test();
> echo $wert;

--------------------------
Beispiel für bool:

//function
function beispiel(){
//Irgendwas verarbeiten

if($irgendWasVerarbeiten=="allesInOrdnung"){
return true;
}
else{
return false;
}
}

//Aufruf
if(beispiel()){
echo "Alles Passt";
}
else{
echo "Scheisse passiert";
}

--------------------------
Beispiel für string(geht genauso mit Integer/Array/...:

//function
function beispiel($a,$b){
//Irgendwas verarbeiten und evtl mit "return false" abbrechen
$c=$a . ' ' . $b;
return $c;
}

//Aufruf
if($test=beispiel("Alles", "passt")){
echo $test;
}
else{
echo "Scheisse passiert";
}
--------------------------
Ergibt:
Alles Passt

oder

Scheisse passiert
--------------------------


Bei längeren Funktionen (oder allgemein bei Funktionen) baust du bei
einem Fehlverhalten ein "return false;" ein, oder gibst true bzw. ein
Ergebnis im Erfolgsfall zurück.


MfG
A.Falk

Re: Wo landen Rueckgabewerte?

am 28.06.2006 10:47:17 von Andre Manikofski

Hans-Jürgen Schneider schrieb:
> Hallo Leute,
>
> Funktionen liefern Werte zurück. Oder auch nicht.
> Wenn ich schreibe:
> function test {
> }
> $wert = test();
> echo $wert;
> Dann gibt das keine Fehlermeldung. Hier hat Er also einen Wert erlogen.
> Würde meine Funktion ein 'return "mist"' enthalten, dann kann ich aber
> genau so gut auf die Auswertung verzichten:
> test();
> Ich möchte wissen auf welchem Haufen ;) der Rückgabewert landet.
> Schlimmer noch:
> flock($datei, 1) or die("Kann nicht...
> verknüpft Ergebnisse auf für mich nicht nachvollziehbare Weise.
> Und ich weiß nicht, wie ich hilfreiche Lektüre finden kann.
>
> MfG
> hjs

Hallo Liste,

intern wird soweit ich es noch weiß ein ZEND_RETURN zurückgegeben - wenn
kein explizites return benutzt wird.

Gruß
André