Was ist in PHP 5 der Unterschied zwischen der Verwendung von self
y $this
?
Wann ist was angebracht?
Was ist in PHP 5 der Unterschied zwischen der Verwendung von self
y $this
?
Wann ist was angebracht?
$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?
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 :)
Von dieser Blogbeitrag :
self
bezieht sich auf die aktuelle Klasseself
kann zum Aufruf statischer Funktionen und zum Verweis auf statische Mitgliedsvariablen verwendet werdenself
kann innerhalb statischer Funktionen verwendet werdenself
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 Sieself
stattdessen.$this
kann nicht innerhalb statischer Funktionen verwendet werden
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.
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
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 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.
0 Stimmen
Mögliche Duplikate von Neues Selbst vs. neue Statik