2219 Stimmen

Wann sollte ich "self" statt "$this" verwenden?

Was ist in PHP 5 der Unterschied zwischen der Verwendung von self y $this ?

Wann ist was angebracht?

0 Stimmen

Mögliche Duplikate von Neues Selbst vs. neue Statik

102voto

lo_fye Punkte 6738

$this-> wird verwendet, um auf eine bestimmte Instanz von Variablen (Mitgliedsvariablen) oder Methoden einer Klasse zu verweisen.

Example: 
$derek = new Person();

$derek ist jetzt eine spezifische Instanz von Person. Jede Person hat einen Vornamen und einen Nachnamen, aber $derek hat einen bestimmten Vornamen und Nachnamen (Derek Martin). Innerhalb der Instanz $derek können wir auf diese als $this->Vorname und $this->Nachname verweisen

ClassName:: wird verwendet, um auf diese Art von Klasse und ihre statischen Variablen und statischen Methoden zu verweisen. Wenn es Ihnen hilft, können Sie gedanklich das Wort "static" durch "shared" ersetzen. Da sie gemeinsam genutzt werden, können sie nicht auf $this verweisen, das sich auf eine bestimmte (nicht gemeinsam genutzte) Instanz bezieht. Statische Variablen (d.h. static $db_connection) können von allen Instanzen eines Objekttyps gemeinsam genutzt werden. Zum Beispiel teilen sich alle Datenbankobjekte eine einzige Verbindung (static $connection).

Statische Variablen Beispiel: Nehmen wir an, wir haben eine Datenbankklasse mit einer einzigen Mitgliedsvariablen: static $num_connections; Nun fügen wir dies in den Konstruktor ein:

function __construct()
{
    if(!isset $num_connections || $num_connections==null)
    {
        $num_connections=0;
    }
    else
    {
        $num_connections++;
    }
}

Genauso wie Objekte Konstruktoren haben, haben sie auch Destruktoren, die ausgeführt werden, wenn das Objekt stirbt oder nicht mehr gesetzt ist:

function __destruct()
{
    $num_connections--;
}

Jedes Mal, wenn wir eine neue Instanz erstellen, wird unser Verbindungszähler um eins erhöht. Jedes Mal, wenn wir eine Instanz zerstören oder nicht mehr verwenden, wird der Verbindungszähler um eins verringert. Auf diese Weise können wir die Anzahl der Instanzen des Datenbankobjekts, die wir verwenden, überwachen:

echo DB::num_connections;

Da $num_connections statisch (gemeinsam genutzt) ist, gibt es die Gesamtzahl der aktiven Datenbankobjekte wieder. Vielleicht haben Sie diese Technik schon einmal gesehen, um Datenbankverbindungen für alle Instanzen einer Datenbankklasse gemeinsam zu nutzen. Dies geschieht, weil das Erstellen der Datenbankverbindung viel Zeit in Anspruch nimmt, so dass es am besten ist, nur eine zu erstellen und diese gemeinsam zu nutzen (dies wird als Singleton-Muster bezeichnet).

Statische Methoden (z.B. public static View::format_phone_number($digits)) können OHNE vorherige Instanziierung eines dieser Objekte verwendet werden (d.h. sie verweisen intern nicht auf $this).

Beispiel für eine statische Methode:

public static function prettyName($first_name, $last_name)
{
    echo ucfirst($first_name).' '.ucfirst($last_name);
}

echo Person::prettyName($derek->first_name, $derek->last_name);

Wie Sie sehen können, weiß die öffentliche statische Funktion prettyName nichts über das Objekt. Sie arbeitet nur mit den Parametern, die Sie übergeben, wie eine normale Funktion, die nicht Teil eines Objekts ist. Warum also die Mühe machen, wenn wir sie einfach nicht als Teil des Objekts haben könnten?

  1. Erstens hilft die Zuordnung von Funktionen zu Objekten dabei, die Dinge zu organisieren, so dass Sie wissen, wo sie zu finden sind.
  2. Zweitens werden Benennungskonflikte vermieden. In einem großen Projekt werden Sie wahrscheinlich zwei Entwickler haben, die getName()-Funktionen erstellen. Wenn einer eine ClassName1::getName() und der andere eine ClassName2::getName() erstellt, ist das überhaupt kein Problem. Kein Konflikt. Ein Hoch auf statische Methoden!

SELF:: Wenn Sie kodieren außerhalb das Objekt, das über die statische Methode verfügt, auf die Sie sich beziehen möchten, müssen Sie diese mit dem Objektnamen View::format_phone_number($phone_number) aufrufen; Wenn Sie kodieren innerhalb das Objekt, das über die statische Methode verfügt, auf die Sie verweisen möchten, können Sie entweder Verwenden Sie den Namen des Objekts View::format_phone_number($pn), ODER Sie können die Abkürzung self::format_phone_number($pn) verwenden

Das Gleiche gilt für statische Variablen: Beispiel: Ansicht::templates_path versus self::templates_path

Wenn wir uns innerhalb der DB-Klasse auf eine statische Methode eines anderen Objekts beziehen würden, würden wir den Namen des Objekts verwenden: Beispiel: Session::getUsersOnline();

Aber wenn die DB-Klasse auf ihre eigene statische Variable verweisen wollte, würde sie einfach self sagen: Beispiel: self::connection;

Ich hoffe, das hilft, die Dinge zu klären :)

31voto

okconfused Punkte 3359

Von dieser Blogbeitrag :

  • self bezieht sich auf die aktuelle Klasse
  • self kann zum Aufruf statischer Funktionen und zum Verweis auf statische Mitgliedsvariablen verwendet werden
  • self kann innerhalb statischer Funktionen verwendet werden
  • self kann auch polymorphes Verhalten ausschalten, indem es die vtable umgeht
  • $this bezieht sich auf das aktuelle Objekt
  • $this kann zum Aufruf statischer Funktionen verwendet werden
  • $this sollte nicht verwendet werden, um statische Mitgliedsvariablen aufzurufen. Verwenden Sie self stattdessen.
  • $this kann nicht innerhalb statischer Funktionen verwendet werden

27voto

ramin rostami Punkte 315

In PHP verwenden Sie das Schlüsselwort self, um auf statische Eigenschaften und Methoden zuzugreifen.

Das Problem ist, dass man die $this->method() con self::method() überall, egal ob method() als statisch deklariert ist oder nicht. Welche sollten Sie also verwenden?

Betrachten Sie diesen Code:

class ParentClass {
    function test() {
        self::who();    // will output 'parent'
        $this->who();   // will output 'child'
    }

    function who() {
        echo 'parent';
    }
}

class ChildClass extends ParentClass {
    function who() {
        echo 'child';
    }
}

$obj = new ChildClass();
$obj->test();

In diesem Beispiel, self::who() wird immer 'parent' ausgeben, während $this->who() hängt davon ab, welche Klasse das Objekt hat.

Jetzt können wir sehen, dass self sich auf die Klasse bezieht, in der es aufgerufen wird, während $this bezieht sich auf die Klasse des aktuellen Objekts .

Sie sollten self also nur verwenden, wenn $this nicht verfügbar ist, oder wenn Sie nicht zulassen wollen, dass Nachfolgeklassen die aktuelle Methode überschreiben.

23voto

Kabir Hossain Punkte 2542

self bezieht sich auf die aktuelle Klasse (in der sie aufgerufen wird),

$this bezieht sich auf das aktuelle Objekt. Sie können static anstelle von self verwenden.

Siehe das Beispiel:

class ParentClass {
    function test() {
        self::which();    // Outputs 'parent'
        $this->which();   // Outputs 'child'
    }

    function which() {
        echo 'parent';
    }
}

class ChildClass extends ParentClass {
    function which() {
        echo 'child';
    }
}

$obj = new ChildClass();
$obj->test();

Ausgabe:

 parent
 child

22voto

Tarun Singhal Punkte 927

Innerhalb einer Klassendefinition, $this bezieht sich auf das aktuelle Objekt, während self bezieht sich auf die aktuelle Klasse.

Es ist notwendig, auf ein Klassenelement zu verweisen, indem man self und verweisen auf ein Objektelement mit $this .

self::STAT // refer to a constant value
self::$stat // static variable
$this->stat // refer to an object variable

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