Ich habe ein Problem:
Ich schreibe eine neue WebApp ohne Framework.
In meiner index.php verwende ich:require_once('load.php');
Und in load.php lade ich require_once('class.php');
meine class.php .
In meiner class.php habe ich diesen Fehler:
Schwerwiegender Fehler: Verwenden Sie $ this, wenn Sie sich nicht im Objektkontext in class.php online befinden ... (in diesem Beispiel wäre es 11)
Ein Beispiel, wie meine class.php geschrieben ist:
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 meiner index.php lade ich vielleicht foobarfunc()
so:
foobar::foobarfunc();
kann aber auch sein
$foobar = new foobar;
$foobar->foobarfunc();
Warum kommt der Fehler?
Antworten:
Sie können die Methode auf diese Weise nicht aufrufen, da es sich nicht um eine statische Methode handelt.
Sie sollten stattdessen verwenden:
Wenn Sie jedoch eine statische Methode erstellt haben, wie zum Beispiel:
dann können Sie dies verwenden:
quelle
$this->foo
ist ein Klassenmitglied, während$foo
es nur eine Variable im Funktionsbereich ist (aus dem globalen Bereich importiert). Funktionsnamen mit demselben Namen wie ein Mitglied sind ebenfalls kein Problem.$this
in einer statischen Methode verwenden.::
. Es ist dagegenE_STRICT
, aber es funktioniert , solange der Methodenkörper nicht auf den Instanzbereich verweist, z$this
. B. verwendet . Auchself::foo
wird nicht darauf hinweisen$this->foo
. Es verweist auf eine Klasse konstant . Beidesself::foo
undself::$foo
würde einen schwerwiegenden Fehler auslösen.Sie rufen eine nicht statische Methode auf:
Verwenden eines statischen Aufrufs:
Bei Verwendung eines statischen Aufrufs wird die Funktion aufgerufen (auch wenn sie nicht als deklariert ist
static
) , aber da es keine Instanz eines Objekts gibt, gibt es keine$this
.So :
Hier verwenden die Methoden Ihrer Klasse die aktuelle Instanz der Klasse, da sie auf die zugreifen müssen
$foo
Eigenschaft der Klasse .Dies bedeutet, dass Ihre Methoden eine Instanz der Klasse benötigen - was bedeutet, dass sie nicht statisch sein können.
Dies 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:
Für weitere Informationen lesen Sie bitte das PHP-Handbuch:
Beachten Sie auch, dass Sie diese Zeile in Ihrer
__construct
Methode wahrscheinlich nicht benötigen :Wenn Sie das
global
Schlüsselwort verwenden, wird die$foo
außerhalb aller Funktionen und Klassen deklarierte Variable innerhalb dieser Methode sichtbar ... Und Sie haben wahrscheinlich keine solche$foo
Variable.Um auf die
$foo
class-Eigenschaft zuzugreifen , müssen Sie nur verwenden$this->foo
, wie Sie es getan haben.quelle
Wenn Sie
foobarfunc
mit dem Auflösungsbereichsoperator (::
) aufrufen , rufen Sie ihn statisch auf , z. B. auf Klassenebene anstelle der Instanzebene, und verwenden ihn daher ,$this
wenn Sie sich nicht im Objektkontext befinden .$this
existiert nicht im Klassenkontext.Wenn Sie aktivieren
E_STRICT
, wird PHP einen Hinweis dazu auslösen:Tun Sie dies stattdessen
Nebenbei schlage ich vor, nicht in
global
Ihren Klassen zu verwenden. Wenn Sie innerhalb Ihrer Klasse etwas von außerhalb benötigen, übergeben Sie es dem Konstruktor. Dies wird als Abhängigkeitsinjektion bezeichnet und macht Ihren Code viel wartbarer und weniger abhängig von äußeren Dingen.quelle
Zuerst verstehen Sie eine Sache: $ this innerhalb einer Klasse bezeichnet das aktuelle Objekt .
Das heißt, Sie werden außerhalb der Klasse erstellt, um die Klassenfunktion oder -variable 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. Nun hier $ das ist nichts. Deshalb heißt es: Verwenden Sie $ this, wenn Sie sich nicht im Objektkontext in class.php befinden
Lösungen:
Erstellen Sie ein Objekt und rufen Sie foobarfunc () auf.
Rufen Sie foo () mit dem Klassennamen im foobarfunc () auf.
quelle
Wenn Sie die Funktion in einem statischen Kontext aufrufen,
$this
einfach nicht.Sie müssten verwenden
this::xyz()
stattdessen verwenden.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 beschrieben: Wie kann festgestellt werden , ob ich statisch oder ein Objekt bin?
quelle
Schnelle Methode: (new foobar ()) -> foobarfunc ();
Sie müssen Ihre Klasse ersetzen ersetzen:
durch :
oder :
Oder machen Sie statische Funktion zu verwenden
foobar::
.quelle
$foobar = new foobar;
Setzen Sie die Klasse foobar in $ foobar, nicht das Objekt . Um das Objekt zu erhalten, müssen Sie Klammern hinzufügen:$foobar = new foobar();
Ihr Fehler ist einfach, dass Sie eine Methode für eine Klasse aufrufen, sodass es keine gibt,
$this
da sie$this
nur in Objekten vorhanden ist.quelle
Es scheint mir ein Fehler in PHP zu sein. Der Fehler
erscheint in der Funktion using
$this
, aber der Fehler ist, dass die aufrufende Funktion die nicht statische Funktion als statische Funktion verwendet. Dh:Während der Fehler hier ist:
quelle
Verwenden Sie dazu einfach die Class-Methode
foobar->foobarfunc();
quelle