
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?

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

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->foo
wie du es getan hast.

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_STRICT
wird 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:
-
Erstellen Sie ein Objekt und rufen Sie foobarfunc() auf.
-
Rufen Sie foo() mit dem Klassennamen innerhalb von foobarfunc() auf.

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?

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

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();
9887700cookie-checkSchwerwiegender PHP-Fehler: Verwendung von $this, wenn nicht im Objektkontextyes
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