Die Verwendung von $ this in einer statischen Funktion schlägt fehl

77

Ich habe diese Methode, in der ich $ this verwenden möchte, aber alles, was ich bekomme, ist: Schwerwiegender Fehler: Verwenden von $ this, wenn nicht im Objektkontext.

Wie kann ich das zum Laufen bringen?

public static function userNameAvailibility()
{
     $result = $this->getsomthin();
}
Jom
quelle

Antworten:

136

Dies ist der richtige Weg

public static function userNameAvailibility()
{
     $result = self::getsomthin();
}

Verwenden Sie self::statt $this->für statische Methoden .

Siehe: PHP Static Methods Tutorial für weitere Informationen :)

Sarfraz
quelle
1
Es stimmt, ich wollte gerade diese Antwort posten.
Gaurav Sharma
13
Sie sollten sich auch daran erinnern, dass die Methode getsomthin () auch statisch sein muss - Sie können innerhalb einer statischen Methode nicht nicht statisch aufrufen.
Thorinkor
7
@Sarfraz, sollte es nicht static::statt sein self::?
Pacerier
Gibt es eine Möglichkeit, in C / C ++ etwas Ähnliches zu tun?
thnkwthprtls
14

Sie können nicht $thisinnerhalb einer statischen Funktion verwenden, da statische Funktionen unabhängig von instanziierten Objekten sind. Versuchen Sie, die Funktion nicht statisch zu machen.

Bearbeiten : Per Definition können statische Methoden ohne instanziiertes Objekt aufgerufen werden, und daher gibt es keine sinnvolle Verwendung $thisinnerhalb einer statischen Methode.

catchmeifyoutry
quelle
2
Dies sollte der Fall sein, wenn Sie versuchen, die statische Variable einer Instanzvariablen zuzuweisen. Ist das nicht möglich?
Jom
5

Innerhalb der statischen Funktion können mit self :: nur statische Funktionen aufgerufen werden. Wenn Ihre Klasse eine nicht statische Funktion enthält, die Sie verwenden möchten, können Sie die Instanz derselben Klasse deklarieren und verwenden.

<?php
class some_class{
function nonStatic() {
    //.....  Some code ....   
    }
 Static function isStatic(){
    $someClassObject = new some_class;
    $someClassObject->nonStatic();
    } 
}
?>
Gourav
quelle
3

Der Accessor thisbezieht sich auf die aktuelle Instanz der Klasse. Da statische Methoden nicht von der Instanz ausgeführt werden, ist die Verwendung thisgesperrt. Man muss also die Methode direkt hier aufrufen. Die statische Methode kann nicht auf etwas im Bereich der Instanz zugreifen, sondern auf alles im Klassenbereich außerhalb des Instanzbereichs.

Kangkan
quelle
1

Schade, dass PHP keinen ausreichend beschreibenden Fehler aufweist. Sie können $ this-> nicht in einer statischen Funktion verwenden, sondern self ::, wenn Sie eine Funktion innerhalb derselben Klasse aufrufen müssen

Midas Mtileni
quelle
1

Hier ist ein Beispiel dafür, was passiert, wenn eine Methode einer Klasse falsch aufgerufen wird. Sie werden einige Warnungen sehen, wenn Sie diesen Code ausführen, aber er wird funktionieren und Folgendes ausgeben: "Ich bin A: B-Eigenschaft drucken". (In php5.6 ausgeführt)

class A {
    public function aMethod() {
        echo "I'm A: ";
        echo "printing " . $this->property;
    }
}

class B {
    public $property = "B property";

    public function bMethod() {
        A::aMethod();
    }
}

$b = new B();
$b->bMethod();

Es scheint, dass die Variable $ this, die in einer Methode verwendet wird, die als statische Methode aufgerufen wird, auf die Instanz der Klasse "caller" verweist. Im obigen Beispiel wird in der A-Klasse die Eigenschaft $ this-> verwendet, die auf eine Eigenschaft des B verweist.

BEARBEITEN:

Die Pseudovariable $ this ist verfügbar, wenn eine Methode aus einem Objektkontext heraus aufgerufen wird. $ Dies ist eine Referenz auf das aufrufende Objekt ( normalerweise das Objekt, zu dem die Methode gehört, aber möglicherweise ein anderes Objekt, wenn die Methode statisch aus dem Kontext eines sekundären Objekts aufgerufen wird ). PHP> Die Grundlagen

Nicolai Nita
quelle
1

Bei der statischen Methode beziehen sich die Eigenschaften auf die Klasse und nicht auf das Objekt. Aus diesem Grund ist der Zugriff auf statische Methoden oder Features möglich, ohne dass ein Objekt erstellt werden muss. $ Dies bezieht sich auf ein Objekt aus einer Klasse, aber $ self bezieht sich nur auf dieselbe Klasse.

Abbas Rahmati
quelle