Dieter: Referenz in PHP--Funktion

Hallo,
also ich habe eine Funktion, die gibt nicht nur einen Wert zurück, sondern soll auch noch eine übergebene Variable ändern.

Beispiel:
<?php
function add(&$var) { $var +=5; }
$var = 10;
add(&$var);
echo $var; //Ausgabe: 15
?>
(Ein Return ist in meinem Beispiel nicht möglich, global ist auch nicht das wahre)

Naja bei mir klappt dieser Script, ein Freund meinte aber, folgende Fehlermeldung zu erhalten:

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 runtime function name. 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 script.php on line 2

So jetzt die Frage, wie muss der Script richtig aussehen*, es gibt ja ein paar Möglichkeiten:

#1:
function add(&$var) { $var +=5; }
add(&$var);

#2:
function add(&$var) { $var +=5; }
add($var);

#3:
function add($var) { $var +=5; }
add(&$var);

* Der Script muss möglichst weit Abwärtskompatibel sein, sprich am besten von PHP4.0.6 bis PHP5.1

Grüße
Dieter

  1. Hallo Freunde des gehobenen Forumsgenusses,

    Naja bei mir klappt dieser Script, ein Freund meinte aber, folgende Fehlermeldung zu erhalten:

    Die erhältst du vermutlich auch, wenn du mal error_reporting(2047) and den Anfang
    deines Sciptes schreibst.
    Mach das mal, und probiere alle Möglichkeiten aus.

    Gruß
    Alexander Brock

    --
    SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:? ss:| de:> js:( ch:| sh:( mo:} zu:}
    http://againsttcpa.com
    1. Hallo,

      Naja bei mir klappt dieser Script, ein Freund meinte aber, folgende Fehlermeldung zu erhalten:

      Die erhältst du vermutlich auch, wenn du mal error_reporting(2047) and den Anfang
      deines Sciptes schreibst.
      Mach das mal, und probiere alle Möglichkeiten aus.

      Also ich hab alle Möglichkeiten mit PHP4.3 und PHP5.0 getestet, mit error_reporting(E_ALL); und bekommt weder Notice noch Warnung.

      Aber wie gesagt, der Script muss abwärtskompatibel sein-

      Grüße
      Dieter

      1. Huhu Dieter

        Also ich hab alle Möglichkeiten mit PHP4.3 und PHP5.0 getestet, mit error_reporting(E_ALL); und bekommt weder Notice noch Warnung.

        Dann ist es vermutlich PHP 4.4.0

        <quote>
        [...]
        The PHP Development Team would like to announce the immediate release of PHP 4.4.0. This is a maintenance release that addresses a serious memory corruption problem within PHP concerning references. If references were used in a wrong way, PHP could create memory corruptions which would not always surface or be visible.

        [...]
        </quote>

        <quote>
        [...]
        As the improved reference support in PHP 4.4 might show as notices and warnings in your existing applications - in cases where PHP formerly just silently ignored this and often causing memory corruptions
        [...]
        </quote>

        Viele Grüße

        lulu

        --
        bythewaythewebsuxgoofflineandenjoytheday
        1. Hallo,

          Also ich hab alle Möglichkeiten mit PHP4.3 und PHP5.0 getestet, mit error_reporting(E_ALL); und bekommt weder Notice noch Warnung.

          Dann ist es vermutlich PHP 4.4.0

          Hab PHP4.4.0 installiert, alles Fuktionierte.
          Ich habe ihn gefragt, er meinte PHP4.3.11 => Installiert => Alles funktioniert.

          Echt komisch

          Grüße
          Dieter

      2. echo $begrüßung;

        Also ich hab alle Möglichkeiten mit PHP4.3 und PHP5.0 getestet, mit error_reporting(E_ALL); und bekommt weder Notice noch Warnung.

        Die kommt nur, wenn die in der Warnung erwähnte Konfigurationseinstellung allow_call_time_pass_reference eingeschaltet ist.

        echo "$verabschiedung $name";

  2. echo $begrüßung;

    function add(&$var) { ...

    Hier sagst du durch das & schon, dass du eine Referenz entgegennehmen möchtest und keine Kopie des Wertes. Deshalb ist das & hier

    add(&$var);

    nicht mehr nötig.

    Es ist zwar zugelassen, aber nicht mehr gern gesehen (deprecated), dass man auch bei

    function add($var) { ...

    also ohne explizit eine Referenz zu verlangen, beim Aufruf (call-time) eine Variable per Referenz zu übergeben (pass-by-reference)

    add(&$var);

    Aber weil es deprecated und meist auch nicht sinnvoll ist, wird besagte Warnung ausgegeben.

    echo "$verabschiedung $name";

    1. Hallo,
      also wäre:
      <?php
      function add(&$var);
      add($var);
      ?>

      die richtige Lösung?

      Grüße
      Dieter