Schwerwiegender PHP-Fehler: Verwendung von $this, wenn nicht im Objektkontext

Lesezeit: 6 Minuten

Schwerwiegender PHP Fehler Verwendung von this wenn nicht im
ahmet2106

Ich habe ein Problem:

Ich schreibe eine neue WebApp ohne Framework.

In meinem index.php Ich benutze: require_once('load.php');

Und in laden.php Ich benutze require_once('class.php'); meine zu laden Klasse.php.

In meinem Klasse.php Ich habe diesen Fehler:

Fatal error: Using $this when not in object context in class.php on line … (in diesem Beispiel wäre es 11)

Ein Beispiel, wie mein Klasse.php ist geschrieben:

class foobar {

    public $foo;

    public function __construct() {
        global $foo;

        $this->foo = $foo;
    }

    public function foobarfunc() {
        return $this->foo();
    }

    public function foo() {
        return $this->foo;
    }
}

In meinem index.php Ich lade vielleicht foobarfunc() so was:

foobar::foobarfunc();

kann aber auch sein

$foobar = new foobar;
$foobar->foobarfunc();

Warum kommt der Fehler?

  • Zufälligerweise habe ich gestern etwa 3 Stunden lang mit diesem Fehler gekämpft! 🙂

    – Jack

    28. Februar 2010 um 12:26 Uhr

  • @jack in meinem Fall habe ich verwendet Das auf statische Funktion

    – Azhar Uddin Scheich

    3. August 2021 um 5:12 Uhr

1646939647 84 Schwerwiegender PHP Fehler Verwendung von this wenn nicht im
Sarfraz

In meiner index.php lade ich vielleicht foobarfunc() so:

 foobar::foobarfunc();  // Wrong, it is not static method

kann aber auch sein

$foobar = new foobar;  // correct
$foobar->foobarfunc();

Sie können die Methode nicht auf diese Weise aufrufen, da es sich nicht um eine statische Methode handelt.

foobar::foobarfunc();

Sie sollten stattdessen verwenden:

foobar->foobarfunc();

Wenn Sie jedoch eine statische Methode wie die folgende erstellt haben:

static $foo; // your top variable set as static

public static function foo() {
    return self::$foo;
}

dann kannst du das verwenden:

foobar::foobarfunc();

  • Die gleichnamigen Variablen sind kein Problem. $this->foo ist ein Klassenmitglied, während $foo ist nur eine Variable im Funktionsbereich (importiert aus dem globalen Bereich). Funktionsnamen mit demselben Namen wie ein Member sind ebenfalls kein Problem.

    – Gordon

    28. Februar 2010 um 12:08 Uhr


  • Sie können nicht verwenden $this in einem statischen Verfahren.

    – Yacoby

    28. Februar 2010 um 12:17 Uhr

  • Es ist lustig, wie eine völlig falsche Antwort trotzdem positive Stimmen erhält. $this ist im Klassenkontext nicht verfügbar. Das OP erhält denselben Fehler aus dem obigen Beispiel.

    – Gordon

    28. Februar 2010 um 12:20 Uhr


  • @Safraz Nichts für ungut, aber es ist immer noch falsch. Sie kann Rufen Sie eine Instanzmethode mit auf ::. Es ist gegen E_STRICTaber es tut funktionieren, solange der Methodenkörper nicht auf den Geltungsbereich der Instanz verweist, z. B. uses $this. Ebenfalls, self::foo wird nicht darauf hinweisen $this->foo. Es verweist auf eine Klasse Konstante. Beide, self::foo und self::$foo würde einen fatalen Fehler auslösen.

    – Gordon

    28. Februar 2010 um 12:34 Uhr


  • @ Sarfraz jetzt ist es besser. Tut mir leid, dass ich Sie belästige, aber da dies zur akzeptierten Antwort wurde, hielt ich es für notwendig, auf diese Dinge hinzuweisen 🙂 Vielen Dank für Ihre Geduld.

    – Gordon

    28. Februar 2010 um 13:00 Uhr

Schwerwiegender PHP Fehler Verwendung von this wenn nicht im
Pascal Martin

Sie rufen eine nicht statische Methode auf:

public function foobarfunc() {
    return $this->foo();
}

Verwenden eines statischen Anrufs:

foobar::foobarfunc();

Bei Verwendung eines statischen Aufrufs wird die Funktion aufgerufen (auch wenn nicht deklariert als static)aber da es keine Instanz eines Objekts gibt, gibt es keine $this.

Damit :

  • Sie sollten keine statischen Aufrufe für nicht statische Methoden verwenden
  • Ihre statischen Methoden (oder statisch aufgerufenen Methoden) können $this nicht verwenden, was normalerweise auf die aktuelle Instanz der Klasse zeigt, da es keine Klasseninstanz gibt, wenn Sie statische Aufrufe verwenden.

Hier verwenden die Methoden Ihrer Klasse die aktuelle Instanz der Klasse, da sie auf die zugreifen müssen $foo Eigentum der Klasse.

Das bedeutet, dass Ihre Methoden eine Instanz der Klasse benötigen – was bedeutet, dass sie nicht statisch sein können.

Das bedeutet, dass Sie keine statischen Aufrufe verwenden sollten: Sie sollten die Klasse instanziieren und das Objekt verwenden, um die Methoden aufzurufen, wie Sie es in Ihrem letzten Teil des Codes getan haben:

$foobar = new foobar();
$foobar->foobarfunc();

Für weitere Informationen zögern Sie nicht, im PHP-Handbuch zu lesen:

Beachten Sie auch, dass Sie diese Zeile in Ihrem wahrscheinlich nicht benötigen __construct Methode :

global $foo;

Verwendung der global Stichwort werde das machen $foo Variable, außerhalb aller Funktionen und Klassen deklariert, innerhalb dieser Methode sichtbar … Und Sie haben wahrscheinlich keine solche $foo Variable.

Für den Zugriff auf die $foo Klasseneigenschaftmüssen Sie nur verwenden $this->foowie du es getan hast.

1646939648 769 Schwerwiegender PHP Fehler Verwendung von this wenn nicht im
Gordon

Wenn Sie anrufen foobarfunc mit Resolution Scope-Operator (::), dann rufst du es an statischzB auf der Klassenebene statt auf der Instanzebene, also bist du verwenden $this wenn nicht im Objektkontext. $this existiert nicht im Klassenkontext.

Wenn Sie aktivieren E_STRICTwird PHP diesbezüglich einen Hinweis auslösen:

Strict Standards: 
Non-static method foobar::foobarfunc() should not be called statically

Tun Sie dies stattdessen

$fb = new foobar;
echo $fb->foobarfunc();

Nebenbei schlage ich vor, es nicht zu verwenden global in Ihren Klassen. Wenn Sie etwas von außerhalb Ihrer Klasse benötigen, übergeben Sie es durch den Konstruktor. Das nennt man Abhängigkeitsspritze und es wird Ihren Code viel wartbarer und weniger abhängig von äußeren Dingen machen.

Zuerst verstehst du eines, $das innerhalb einer Klasse bezeichnet die aktuelles Objekt.
Das heißt, Sie werden außerhalb der Klasse erstellt, um Klassenfunktionen oder -variablen aufzurufen.

Wenn Sie also Ihre Klassenfunktion wie foobar::foobarfunc() aufrufen, wird kein Objekt erstellt. Aber innerhalb dieser Funktion, die Sie geschrieben haben, geben Sie $this->foo() zurück. Hier $das ist nichts. Deshalb heißt es Verwenden von $this, wenn es sich nicht im Objektkontext in class.php befindet

Lösungen:

  1. Erstellen Sie ein Objekt und rufen Sie foobarfunc() auf.

  2. Rufen Sie foo() mit dem Klassennamen innerhalb von foobarfunc() auf.

Schwerwiegender PHP Fehler Verwendung von this wenn nicht im
Pekka

Wenn Sie die Funktion in einem statischen Kontext aufrufen, $this gibt es einfach nicht.

Sie müssten verwenden this::xyz() stattdessen.

Um herauszufinden, in welchem ​​Kontext Sie sich befinden, wenn eine Funktion sowohl statisch als auch in einer Objektinstanz aufgerufen werden kann, wird in dieser Frage ein guter Ansatz skizziert: Wie erkenne ich, ob ich statisch oder ein Objekt bin?

1646939649 364 Schwerwiegender PHP Fehler Verwendung von this wenn nicht im
Sky Voyager

Schnelle Methode: (neues foobar())->foobarfunc();

Sie müssen Ihre Klasse ersetzen ersetzen:

foobar::foobarfunc();

durch :

(new foobar())->foobarfunc();

oder :

$Foobar = new foobar();
$Foobar->foobarfunc();

Oder machen statisch Funktion zu verwenden foobar::.

class foobar {
    //...

    static function foobarfunc() {
        return $this->foo();
    }
}

1646939649 692 Schwerwiegender PHP Fehler Verwendung von this wenn nicht im
Mischx

Es scheint mir ein Fehler in PHP zu sein. Der Fehler

‘Fatal error: Uncaught Error: Using $this when not in object context in’

erscheint in der Funktion mit $this, aber der Fehler ist, dass die aufrufende Funktion eine nicht statische Funktion als eine statische verwendet. Dh:

Class_Name
{
    function foo()
    {
        $this->do_something(); // The error appears there.
    }
    function do_something()
    {
        ///
    }
}

Während der Fehler hier ist:

Class_Name::foo();

988770cookie-checkSchwerwiegender PHP-Fehler: Verwendung von $this, wenn nicht im Objektkontext

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy