Mam problem:
Piszę nową aplikację internetową bez Framework.
W moim index.php używam:require_once('load.php');
A w load.php używam require_once('class.php');
do ładowania mojego class.php .
W moim class.php mam ten błąd:
Błąd krytyczny: użycie $ this bez kontekstu obiektu w class.php on-line ... (w tym przykładzie byłoby to 11)
Przykład, jak napisane jest moje class.php :
class foobar {
public $foo;
public function __construct() {
global $foo;
$this->foo = $foo;
}
public function foobarfunc() {
return $this->foo();
}
public function foo() {
return $this->foo;
}
}
W moim index.php ładuję może foobarfunc()
tak:
foobar::foobarfunc();
ale może też być
$foobar = new foobar;
$foobar->foobarfunc();
Dlaczego pojawia się błąd?
Odpowiedzi:
foobar::foobarfunc(); // Wrong, it is not static method
$foobar = new foobar; // correct $foobar->foobarfunc();
Nie możesz wywołać metody w ten sposób, ponieważ nie jest to metoda statyczna.
Zamiast tego powinieneś użyć:
Jeśli jednak utworzyłeś statyczną metodę, taką jak:
static $foo; // your top variable set as static public static function foo() { return self::$foo; }
możesz użyć tego:
źródło
$this->foo
jest$foo
składową klasy, a jest tylko zmienną w zakresie funkcji (importowaną z zasięgu globalnego). Nazwy funkcji o takiej samej nazwie jak członek również nie są problemem.$this
w metodzie statycznej.::
. Jest przeciwkoE_STRICT
, ale nie pracować tak długo, jak ciało metoda nie odwoływać się do zakresu zastosowania instancji, np$this
. Nieself::foo
będzie też wskazywać$this->foo
. Odwołuje się do stałej klasy . Obaself::foo
iself::$foo
spowodowałoby błąd krytyczny.Wołasz metodę niestatyczną:
public function foobarfunc() { return $this->foo(); }
Korzystanie z wywołania statycznego:
Podczas korzystania z wywołania statycznego funkcja zostanie wywołana (nawet jeśli nie zostanie zadeklarowana jako
static
) , ale ponieważ nie ma instancji obiektu, nie ma$this
.Więc :
Tutaj metody Twojej klasy używają bieżącej instancji klasy, ponieważ muszą uzyskać dostęp do
$foo
właściwości klasy.Oznacza to, że Twoje metody wymagają instancji klasy - co oznacza, że nie mogą być statyczne.
Oznacza to, że nie powinieneś używać wywołań statycznych: powinieneś zainicjować klasę i użyć obiektu do wywołania metod, tak jak to zrobiłeś w ostatniej części kodu:
$foobar = new foobar(); $foobar->foobarfunc();
Aby uzyskać więcej informacji, nie wahaj się przeczytać w podręczniku PHP:
Zauważ również, że prawdopodobnie nie potrzebujesz tego wiersza w swojej
__construct
metodzie:global $foo;
Użycie
global
słowa kluczowego sprawi, że$foo
zmienna, zadeklarowana poza wszystkimi funkcjami i klasami, będzie widoczna od wewnątrz tej metody ... I prawdopodobnie nie masz takiej$foo
zmiennej.Aby uzyskać dostęp do
$foo
właściwości klasy , musisz tylko użyć$this->foo
, tak jak zrobiłeś.źródło
Jeśli wywołujesz
foobarfunc
z operatorem zakresu rozpoznawania (::
), to wywołujesz go statycznie , np. Na poziomie klasy zamiast na poziomie instancji, więc używasz$this
go poza kontekstem obiektu .$this
nie istnieje w kontekście klasowym.Jeśli włączysz
E_STRICT
, PHP zgłosi powiadomienie o tym:Strict Standards: Non-static method foobar::foobarfunc() should not be called statically
Zrób to zamiast tego
$fb = new foobar; echo $fb->foobarfunc();
Na marginesie, sugeruję, aby nie używać ich podczas
global
zajęć. Jeśli potrzebujesz czegoś spoza swojej klasy, prześlij to przez konstruktora. Nazywa się to wstrzykiwaniem zależności i sprawi, że twój kod będzie znacznie łatwiejszy w utrzymaniu i mniej zależny od rzeczy zewnętrznych.źródło
Najpierw zrozumiesz jedną rzecz, $ this wewnątrz klasy oznacza bieżący obiekt .
To znaczy, że jesteś utworzony poza klasą, aby wywołać funkcję lub zmienną klasy.
Więc kiedy wywołujesz funkcję klasy, taką jak foobar :: foobarfunc (), obiekt nie jest tworzony. Ale wewnątrz tej funkcji napisałeś return $ this-> foo (). Tutaj $ to nic. Dlatego mówi, używając $ this, gdy nie jest w kontekście obiektu w class.php
Rozwiązania:
Utwórz obiekt i wywołaj foobarfunc ().
Wywołaj foo () używając nazwy klasy wewnątrz foobarfunc ().
źródło
Kiedy wywołujesz funkcję w kontekście statycznym,
$this
po prostu nie istnieje.Zamiast tego musiałbyś użyć
this::xyz()
.Aby dowiedzieć się, w jakim kontekście się znajdujesz, gdy funkcję można wywołać zarówno statycznie, jak iw instancji obiektu, dobre podejście jest nakreślone w tym pytaniu: Jak stwierdzić, czy jestem statyczny, czy obiekt?
źródło
Szybka metoda: (new foobar ()) -> foobarfunc ();
Musisz załadować zamianę klasy:
przez :
(new foobar())->foobarfunc();
lub:
$Foobar = new foobar(); $Foobar->foobarfunc();
Lub użyj funkcji statycznej
foobar::
.class foobar { //... static function foobarfunc() { return $this->foo(); } }
źródło
$foobar = new foobar;
umieść klasę foobar w $ foobar, a nie obiekt . Aby pobrać obiekt, musisz dodać nawias:$foobar = new foobar();
Twój błąd polega po prostu na tym, że wywołujesz metodę na klasie, więc nie ma jej,
$this
ponieważ$this
istnieje tylko w obiektach.źródło
Wydaje mi się, że to błąd w PHP. Błąd
pojawia się w funkcji using
$this
, ale błąd polega na tym, że funkcja wywołująca używa funkcji statycznej jako statycznej. To znaczy:Class_Name { function foo() { $this->do_something(); // The error appears there. } function do_something() { /// } }
Podczas gdy błąd jest tutaj:
źródło
Po prostu użyj metody Class, używając this
foobar->foobarfunc();
źródło