2 Stimmen

Wird das Zuweisen einer Variablen mit dem Scope Resolution Operator(::) dasselbe wie $this->variable?

Nur neugierig.

Wenn ich self::$session = $reg->get('session'); in einer __construct-Klasse zuweise, kann die Variable dann wie $this->session = $reg->get('session'); als Eigenschaften der Klasse verwendet werden?

Ich habe keine Ahnung, wie ich das testen soll. Der einzige Weg, wie ich das testen könnte, wäre, mein gesamtes Framework zu zerstören, indem ich alles ändere.

5voto

bwoebi Punkte 23332

Nur ein wenig herumprobiert, was auf der PHP-Shell möglich ist (php -a).

php > class a { public $b; function __construct () { self::$b = 10; } }
php > $o = new a;
PHP Fatal error:  Zugriff auf nicht deklarierte statische Eigenschaft: a::$b im php Shell-Code in Zeile 1

php > class a { public static $b; function __construct () { $this->b = 10; } }
php > $o = new a;
php > print $o->b;
10
php > print a::$b;
php > // gibt nichts aus (ist immer noch NULL)

php > class a { public static $b; function __construct () { self::$b = 10; } }
php > $o = new a;
php > print $o->b;
PHP Notice:  Undefinierte Eigenschaft: a::$b im php Shell-Code in Zeile 1

php > // gibt keinen Wert aus (im Grunde NULL)

Was wir herausfinden

  • Sie können einer nicht-statischen Eigenschaft nicht wie einer statischen Eigenschaft zuweisen (mit self::...).
  • Sie können einer statischen Eigenschaft wie einer nicht-statischen Eigenschaft zuweisen. Es erstellt jedoch eine neue implizite nicht-statische öffentliche Eigenschaft anstelle die Wert der statischen Eigenschaft zu ändern.
  • Sie können nicht auf eine statische Eigenschaft wie auf eine nicht-statische Eigenschaft zugreifen.

Fazit

Nein, Sie können nicht zwischen statischen und nicht-statishen Zugriffen und Zuweisungen wechseln.

0voto

Ja͢ck Punkte 165747

Bevor ich damit anfange, könntest du dies auch einfach mit einem Online-Codepad-Tool testen, aber ich dachte, es wäre besser, tatsächlich zu erklären, was hier vor sich geht.

Angenommen, du hast diese Klasse, basierend auf dem, was du beschrieben hast:

class MyClass
{
    private static $session;

    public function __construct($reg)
    {
        self::$session = $reg->get('session');
    }
}

Der Ausdruck self::$session bezieht sich auf eine Klassenvariable, die unter allen Instanzen von MyClass geteilt wird.

Ändern wir die Klasse wie folgt:

class MyClass
{
    private $session;

    public function __construct($reg)
    {
        $this->session = $reg->get('session');
    }
}

Jetzt bezieht sich der Ausdruck $this->session auf eine Instanz variable, die nicht mit irgendeiner anderen Instanz von MyClass geteilt wird.

Aufgrund dieses Unterschieds können sie nicht austauschbar verwendet werden, und du musst eine Entscheidung basierend auf deinem funktionalen Design treffen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X