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();
}

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 :)


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.


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();
    } 
}
?>

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.


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


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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.