Merkwürdiges foreach Verhalten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Original geschrieben von PHP-Desaster
    PHP-Code:
    <?php
    error_reporting
    E_ALL );    
    class 
    Test {
        private 
    $var = array( 'foo'=>'foo' );
        function &
    getByRef$name ) {
            return( 
    $this->var[$name] );
        }
    }
    $t = new Test();
    $t->getByRef'foo' );
    ?>
    Öhm... das ist mMn auch bananiger Code Oo
    Der Funktionskopf sagt "Referenz" und was geht weg - ein Wert

    Ich würd es mit
    return &$this->var[$name]
    probieren und das & im Funktionskopf ist dann auch hinfällig... ich glaub das stammt eh noch aus PHP4-Zeiten

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #17
      Die Klammern um ein Argument sind deshalb nur zwingend notwendig, wenn es sich um einen Ausdruck handelt, dessen Ergebnis zurückgegeben werden soll. Es ist gebräuchlich die Klammern wegzulassen, wenn eine Variable zurück gegeben soll.
      Diesen Unterschied kannte ich noch nicht. Ohne Klammern ist die Rückgabe wirklich eine Andere. In meinem Beispiel fehlt allerdings das Referenzzeichen vor dem Funktionsaufruf.
      Ich würd es mit
      return &$this->var[$name]
      probieren und das & im Funktionskopf ist dann auch hinfällig... ich glaub das stammt eh noch aus PHP4-Zeiten
      Ist Käse, die Funktion muss mit & im Kopf deklariert werden!
      Folgendes Beispiel funktioniert, ist auch für mich neu:
      PHP-Code:
      <?php
      error_reporting
      E_ALL );    
      class 
      Test {
          private 
      $arr = array( 'foo'=>array( 'foo' ) );
          function &
      getByRef$name ) {
              return 
      $this->arr[$name];
          }
      }
      $t = new Test();
      $r = &$t->getByRef'foo' );
      $r[] = 'bar';
      var_dump$t->getByRef'foo' ) );
      ?>
      Ergibt
      Code:
      array(2) {
        [0]=>
        string(3) "foo"
        [1]=>
        string(3) "bar"
      }
      . Danke 3DMax für den Hinweis!

      Das ganze ist mir bisher noch nie aufgefallen, da Objekte ja Referenztypen und keine Wertetypen sind!

      Kommentar


      • #18
        Foreach... (ist ja Teil des Themas) und Referenzen:


        Falls es sich noch nicht rumgesprochen haben sollte
        foreach arbeitet normalerweise mit Kopien.
        Dieser Code wird also keinerlei Veränderung im Array vornehmen:
        PHP-Code:
        // $_SERVER ist hier nur ein Stellvertreter für irgendein Array
        foreach($_SERVER as $value
        {
            
        // trim ist hier nur ein Stellvertreter für irgendwas
            
        $value trim($value);  

        Seit PHP5 ist folgendes möglich:
        PHP-Code:
        // $_SERVER ist hier nur ein Stellvertreter für irgendein Array
        foreach($_SERVER as & $value
        {
            
        // trim ist hier nur ein Stellvertreter für irgendwas
            
        $value trim($value);  

        Hier werden die Elemente wirklich von den Leerzeichen befreit
        Wir werden alle sterben

        Kommentar

        Lädt...
        X