phpbar.de logo

Mailinglisten-Archive

[php] Warum nicht: $bar = (3 == $foo) ? &$foo : &$foo ?

[php] Warum nicht: $bar = (3 == $foo) ? &$foo : &$foo ?

Ulf Wendel ulf.wendel_(at)_phpdoc.de
Tue, 12 Dec 2000 00:30:20 +0100


Matthias Stolt wrote:
> 
> On Mon, 11 Dec 2000 23:21:38 +0100, Ulf Wendel wrote:
> 
> >> > warum muß ich statt $bar = (3 == $foo) ? &$foo : &$foo die Langform mit
> >Ich wundere mich über den Parse Error, des
> >Originals. Der bedingte Ausdruck scheint nicht im Zusammenhang mit
> >Referenzen erlaubt. Warum ist das so?
> 
> Ist nicht die Runtime-Referenz ein auslaufendes Feature?
> In der php.ini-dist findet sich folgender Eintrag.
> 
> allow_call_time_pass_reference= On      ; whether to enable the ability to force arguments to be

Das betrifft die Übergabe von Referenzen an eine Funktion, wenn die
Referenz im Funktionskopf zuvor nicht "angemeldet" wurde. Es ist
folgendes nicht mehr erwünscht. Der Grund dürfte im Compiler liegen.

function foo($arg) {
  $arg = 3;
}

$bar = 9;
foo(&bar);

Der Code wird auch prompt kommentiert:

Warning: Call-time pass-by-reference has been deprecated - argument
passed by value; If you would like to pass it by reference, modify the
declaration of foo(). If you would like to enable call-time
pass-by-reference, you can set allow_call_time_pass_reference to true in
your INI file. However, future versions may not support this any longer.
in c:\www\apache\hs~bla.php4 on line 16

Um dem Problem aus dem Weg zu gehen, ist foo() wie folgt zu deklarieren:

function foo(&$arg) {...

> Wenn ich jetzt den Operator '?' anschaue, dann kann er durchaus als ein Funktionsaufruf mit drei Parametern gesehen werden.
> Sozusagen questionmark($bool,$wert1,$wert2).
> Und dann ist der bemängelte Ausdruck mit questionmark($bool,&$wert1,&$wert2)  zu betrachten, was eine call_time_pass_reference wäre, oder?
> By the way, in meiner Version 4.03pl1 ist der Ausdruck ebenfalls nicht auswertbar. Leider weder mit noch ohne allow_call_time_pass_reference,
> was gegen meine Theorie spricht.

Nein, das ist sehr weit hergeholt. Du kannst einen bedingten Ausdruck
nicht mit einem Funktionsaufruf vergleichen. Dies sind zwei paar Schuhe.
?: muß intern (fast) so gehandhabt werden, wie ein if-else, jedoch nicht
wie ein Funktionsaufruf.

Ulf


php::bar PHP Wiki   -   Listenarchive