PHP Pointer in einer statischen Variable speichern

hoctar

Erfahrenes Mitglied
Hallo,
ich versuche einer statischen Variable einen Pointer zuzuweisen.

PHP:
class Class1 {

        function method() {

                static $obj;

                echo 'Before: <br>';
                var_dump($obj);

                if(!isset($obj)) {

                        $obj =& new stdClass;

                }

                echo 'After: <br>';
                var_dump($obj);

                return $obj;

        }

}

class Class2 {

        function method() {

                static $obj;

                echo 'Before: <br>';
                var_dump($obj);

                if(!isset($obj)) {

                        $obj = new stdClass;

                }

                echo 'After: <br>';
                var_dump($obj);

                return $obj;

        }

}

$obj1 = Class1::method();
$obj2 = Class2::method();

echo '<br><br>';

$obj1 = Class1::method();
$obj2 = Class2::method();

Code:
Before: NULL
After: object(stdClass)#1 (0) { }
Before: NULL
After: object(stdClass)#2 (0) { }

Before: NULL
After: object(stdClass)#3 (0) { }
Before: object(stdClass)#2 (0) { }
After: object(stdClass)#2 (0) { }

Warum wird der Pointer in Class1 nicht in der statischen Variable gespeichert, aber die Kopie in Class2?

Danke schonmal fürs lesen und vllt. antworten :)
 
Wegen dieser Zeile:
PHP:
$obj =& new stdClass;
Wenn ich das richtig in Erinnerung hab werden bei Objekten meistens Referenzen übergeben. Bei der mit =& werden nur die Objekt Attribute Referenziert und da es in dem leeren Objekt keine gibt wird also nix übergeben. Müsste da jetzt aber selber auch erst noch mal genau nachsehen. Es kommen auch einige Warnungen wenn man dein Codebeispiel so ausführt.

Deine Funktionen sollten auch statisch sein wenn du sie über den Paamayim Nekudotayim aufrufst. :)

EDIT:
habs gefunden.
http://de.php.net/manual/de/language.oop5.references.php
 
Zuletzt bearbeitet:
Beim ersten erstellst du eine Referenz mit dem &.

Ich würde aber noch alles sauber deklarieren (public, private, static) und auch $obj als static-Property der Klasse deklarieren, nicht innerhalb der Funktion.
PHP:
class Class3 {

    private static $obj;

    public static function method(){
        echo 'Before: <br>';
        var_dump(self::$obj);
        if(!isset(self::$obj)) {
                self::$obj =& new stdClass;
        }
        echo 'After: <br>';
        var_dump(self::$obj);
        return self::$obj;        
    }
}
So funktioniert es auch, wenn die Zuweisung über eine Referenz erstellt wird
 
PHP:
class Class3 {

    private static $obj;

    public static function method(){
        echo 'Before: <br>';
        var_dump(self::$obj);
        if(!isset(self::$obj)) {
                self::$obj =& new stdClass;
        }
        echo 'After: <br>';
        var_dump(self::$obj);
        return self::$obj;        
    }
}
So funktioniert es auch, wenn die Zuweisung über eine Referenz erstellt wird

Code:
Deprecated: Assigning the return value of new by reference is deprecated ....
 
Verstehe. Was wird den nun in $obj gespeichert, wenn ich die Instanz so bilde $obj = new Class1; ?
Es steht keine Referenz, oder?
 
Beginnend mit PHP 5 enthält eine Objektvariable nicht mehr das Objekt als Wert, sondern nur einen Objektbezeichner, der bei Objektzugriffen die Identifizierung des eigentlichen Objektes ermöglicht.
 
Ein Frage zum Beitrag #3 von Yaslaw.

Warum muss $obj ein Attribute der Klasse sein?
Kann es nicht als statische Variable innerhalb der Methode deklariert werden?
 
Ich habe noch nie mit statischen Varibeln die nur innerhalb einer Funktion siond gearbeitet und weiss nicht wie diese siche verhält. Mit dem statischen Attribut der Klasse weiss ich wie es geht. Es ist ja ein privat Attribut und somit von aussen nicht sichtbar.
 
Zurück