Ankündigung

Einklappen
Keine Ankündigung bisher.

Referenzen auf Objekte innerhalb eines Arrays

Einklappen

Neue Werbung 2019

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

  • Referenzen auf Objekte innerhalb eines Arrays

    Guten Abend,

    ich habe hier ein kleines Problem mit Referenzen auf Objekte innerhalb eines Arrays.
    Mein Script ist recht umfangreich, deswegen habe ich es mal auf ein Beispiel reduziert:
    Code:
    #Testklasse
    class test {
       var $property;
    
       function test($param) {
          $this->property=$param;
       }
    
    }
    
    #Objekte erzeugen
    $objects=array();
    $objects[]=new test(1);
    $objects[]=new test(2);
    $objects[]=new test(3);
    
    #Objekte ausgeben
    echo "<pre>";
    print_r($objects);
    echo"</pre>";
    
    #Referenzen auf Objekte erzeugen
    $references=array();
    foreach($objects as $object) {
       $references[]=&$object;
    }
    
    #Referenzen ausgeben
    echo "<hr /><pre>";
    print_r($references);
    echo"</pre>";
    Die Ausgabe hiervon ist nun
    Code:
    Array
    (
        [0] => test Object
            (
                [property] => 1
            )
        [1] => test Object
            (
                [property] => 2
            )
        [2] => test Object
            (
                [property] => 3
            )
    )
    Array
    (
        [0] => test Object
            (
                [property] => 3
            )
        [1] => test Object
            (
                [property] => 3
            )
        [2] => test Object
            (
                [property] => 3
            )
    )
    Die Referenzen zeigen also alle auf das letzte Element. Was mache ich denn da falsch? Wie müsste ich die Referenzen zuweisen sodass auch wirklich die richtigen Objekte referenziert werden?

    Vielen Dank im Voraus für jeden Tip!

    dms

  • #2
    das ist auch klar ... mit deiner foreach - schleife überschreibst du permanent die referenz.
    das verhalten von php ist also richtig, auch wenn es strange erscheint.

    korrekt würde dein skript so arbeiten:
    PHP-Code:
    <?php
    #Referenzen auf Objekte erzeugen
    $references=array();
    for (
    $i=0,$m=count($objects);$i<$m;$i++) {
      
    $references[] = &$objects[$i];    
    }
    ?>
    grüße
    axo

    Kommentar


    • #3
      Dank Dir vielmals, axo. Das leuchtet mir sogar ein.

      Kommentar


      • #4
        PHP-Code:
        <?php
        $tubel
        =new ListView;
        if(
        $tubel->sortieren("+meine Tunte)==-1) echo("selber ein tubel");
        $ok=true;
         
         
        class ListView {
            var 
        $table;
            var 
        $idArr=array();
            var 
        $ioformArr=array();
            var 
        $indexInt;
            var 
        $write;
            var 
        $deleteOn;
         
            function __construct(
        $ioformArr$idArr=NULL, $deleteOn=NULL) {
            Error::logFunction(8,"
        construct");
                if(!is_array(
        $ioformArr)) $ioformArr=array($ioformArr);
                if(!is_array(
        $idArr)) $idArr=array($idArr);
                
        $this->ioformArr=$ioformArr;
                
        $this->idArr=$idArr;
                
        $this->indexInt=0;
         
                foreach(
        $ioformArr as $ioform) {
                    if(
        $ioform->getStatus()) $write=true;
                }
                
        $this->write=$write;
         
                if(
        $this->write) {
                    echo("
        <form method='post' action='' enctype='multipart/form-data'>");
                    if(!
        $_POST['sub'.$this->table]) {
                        //foreach(
        $ioformArr as $ioform$ioform->setNoWrite(true);
                    }
                    if(
        $_POST['del'.$this->table]) {
                        foreach(
        $ioformArr as $ioform$ioform->setDelete(true);
                    }
                }
         
                if(
        $idArr[0]) sortieren($idArr);
            }
         
            function sortieren(
        $idArr) {
            Error::logFunction(8,"
        sort");
                
        $this->idArr=$idArr;
                
        $ioformArr2=array();
                
        $idArr2=array();
                for(
        $z=0; $z<count($this->ioformArr); $z++) {
                    
        $idArr2[$z]=$this->ioformArr[$z]->getItem(0);
                }
                for(
        $x=0; $x<count($idArr); $x++) {
                    for(
        $z=0; $z<count($idArr2) OR $idArr2[$z]==$idArr[$z]$z++) $ioformArr2[$x]=$this->ioformArr[$z];
                }
                
        $this->ioformArr=$ioformArr2;
            }
         
            function showNext() {
            Error::logFunction(8,"
        showNext");
                if(is_object(
        $this->ioformArr[$this->indexInt])) $this->ioformArr[$this->indexInt]->show();
                
        $this->indexInt++;
            }
         
            function __destruct() {
            Error::logFunction(8,"
        destruct");
                if(
        $this->write) {
                    echo("
        <input type='submit' name'sub".$this->table."' value='Speichern' />");
                    if(
        $this->deleteOn) {
                        echo("
        <input type='button' name'del".$this->table."' value='Abbrechen' /></form>");
                    }
                    echo("
        </form>");
                }
            }
         
        }
         
         
        class ListStandard extends ListView {
            var 
        $style;
            var 
        $spalten;
            var 
        $count;
            /*
            function __construct(
        $table$idArr$elementDArr$spalten$style=NULL, $dBase=NULL, $write=NULL) {
                parent::__construct(
        $table$idArr$elementDArr$style$write);
                
        $this->spalten=$spalten;
                
        $this->style=$style;
                
        $this->count=count($elementDArr[0]);
            }*/
         
            function __construct(
        $elementYArr$idArr=NULL, $deleteOn=NULL) {
            Error::logFunction(8,"
        ListStandard::construct");
                
        $this->style=$style;
                
        $countXs=count($elementYArr);
                
        $this->spalten=$countXs;
                for(
        $z=0; $z<$countXs$z++) if($countYs<count($elementYArr[$z])) $countYs=count($elementYArr[$z]);
                
        $countD=count($elementYArr[0]);
                
        $zD=0;
         
                for(
        $y=0; $y<$countYs$y++) {
                    for(
        $x=0; $x<$countXs$x++) {
                        
        $elementDArr[$zD]=$elementYArr[$x][$y];
                        
        $zD++;
                    }
                }
         
                parent::__construct(
        $elementDArr$idArr$deleteOn);
                
        $this->count=count($elementDArr);
            }
         
            function show() {
            Error::logFunction(8,"
        ListStandard::show");
                echo("
        <table cellspacing='1' cellpadding='1' border='0'>");
                for(
        $x=0; $x<$this->count/$this->spalten$x++) {
                    echo("
        <tr>");
                    for(
        $z=0; $z<$this->spalten$z++) {
                        echo("
        <td style='HEIGHT: 23px'>");
                        parent::showNext();
                        echo("
        </td>");
                    }
                    echo("
        </tr>");
                }
                echo("
        </table>");
            }
        }
         
        ?>
        Edit Chriz: BBCode, bitte nächstes mal selbst einfügen

        Kommentar


        • #5
          Was sollen uns diese Zeilen sagen?
          Viele Grüße,
          Dr.E.

          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          1. Think about software design [B]before[/B] you start to write code!
          2. Discuss and review it together with [B]experts[/B]!
          3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
          4. Write [I][B]clean and reusable[/B][/I] software only!
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

          Kommentar


          • #6
            @TE: OBjekte werden ab PHP5 standardmäßig als Referenz übergeben und das sollte man auch benutzen, statt PHP4

            Kommentar


            • #7
              es genügt das & eine Zeile nach oben zu schieben

              PHP-Code:
              foreach($objects as &$object) {
                 
              $references[]=$object;

              dies ist einer der Gründe weshalb ich kein Fan von foreach bin aber das ist ein anderes Thema, in deinem Fall wird es dir helfen
              DevBlog|3D Online-Shopping|Xatrium

              Kommentar

              Lädt...
              X