Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Referenzen zurückgeben

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Referenzen zurückgeben

    Hallo
    bei Joomla sehe ich öfters Methoden die wie folgt ausehen: &getInstance()
    Diese Methode gibt ein Object zurück, nun frage ich mich wofür das '&' am Anfang steht. Klar es soll eine Referenz zurückgegeben werden, aber ist es denn nicht das Standardverhalten ? Werden Objekte nicht immer als Referenz zurückgegeben ?

    PHP-Code:
    class {

            var 
    $obj;

            function 
    __construct($obj) {
                    
    $this->obj $obj;
            }
            
            function &
    getObj() {
                    return 
    $this->obj;
            }
            
            function 
    getObj2() {
                    return 
    $this->obj;
            }

    }


    class 
    {

            var 
    $b 'b';
            var 
    $a 'a';

    }

    $b = new B;
    $a = new A($b);

    $obj $a->getObj();
    $obj->'123';

    $obj2 $a->getObj2();
    $obj2->'abc';

    echo 
    '<pre>'print_r($obj); echo '</pre>';
    echo 
    '<pre>'print_r($obj2); echo '</pre>'
    Also in diesem Beispiel unterscheide ich die beiden Mehoden &getObj() und getObj().
    Beide geben eine Referenz zu Objekt B, somit ist das Resultat am Ende gleich, denn im Spiecher wurde stets auf ein und die selben Werte zurückgegriffen.

    Was macht das '&' nun für ein unterschied ?


  • #2
    Objekte als Referenz sind erst ab PHP5 Standardverhalten. Genau genommen ist die Referenz, die so angelegt wird auch noch eine andere.

    PHP: Referenzen in PHP - Manual
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Nimm dir kein Beispiel an Joomla, guter Code sieht anders aus! In einem Punkt hast du recht, die Rückgabe als Referenz macht in einem solchen Beispiel keinen Sinn. Einen Unterschied macht es aber schon, denn Objekte werden nicht standardmäßig als Referenzen zurückgegeben!.

      Den Unterschied siehst du wenn du am Ende deines Beispiels einmal folgendes anhängst:
      PHP-Code:
      $obj null;
      var_dump($a); 
      das machst du einmal mit & in der Methode und einmal ohne.

      Zum genaueren Verständnis zum Thema Objekte und Referenzen, lies dir dann auch mal den Abschnitt im Manual durch:
      PHP: Objekte und Referenzen - Manual
      @fschmengler - @fschmengler - @schmengler
      PHP Blog - Magento Entwicklung - CSS Ribbon Generator

      Kommentar


      • #4
        PS:
        PHP-Code:
        <?php

        class {

                function 
        __construct() {
                        
        $this->obj = new b;
                }
                
                function & 
        getObj() {
                        return 
        $this->obj;
                }

                function 
        getObj2() {
                        return 
        $this->obj;
                }
        }

        class 
        {}




        $a = new a;

        $b $a->getObj();

        var_dump ($a);

        $b null;

        var_dump ($a);



        $a = new a;

        $b = & $a->getObj();

        var_dump ($a);

        $b null;

        var_dump ($a);



        $a = new a;

        $b = & $a->getObj2();

        var_dump ($a);

        $b null;

        var_dump ($a);
        Code:
        object(a)#1 (1) {
          ["obj"]=>
          object(b)#2 (0) {
          }
        }
        object(a)#1 (1) {
          ["obj"]=>
          object(b)#2 (0) {
          }
        }
        object(a)#3 (1) {
          ["obj"]=>
          &object(b)#4 (0) {
          }
        }
        object(a)#3 (1) {
          ["obj"]=>
          &NULL
        }
        <br />
        <b>Strict Standards</b>:  Only variables should be assigned by reference in ...
        object(a)#4 (1) {
          ["obj"]=>
          object(b)#1 (0) {
          }
        }
        object(a)#4 (1) {
          ["obj"]=>
          object(b)#1 (0) {
          }
        }
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Verstehe, vielen dank für die Infos

          Kommentar

          Lädt...
          X