Saya punya masalah:
Saya sedang menulis WebApp baru tanpa Framework.
Di index.php saya, saya menggunakan:require_once('load.php');
Dan di load.php yang saya gunakan require_once('class.php');
untuk memuat class.php saya .
Di class.php saya saya punya kesalahan ini:
Kesalahan fatal: Menggunakan $ this ketika tidak dalam konteks objek di class.php on line ... (dalam contoh ini akan menjadi 11)
Contoh bagaimana class.php saya ditulis:
class foobar {
public $foo;
public function __construct() {
global $foo;
$this->foo = $foo;
}
public function foobarfunc() {
return $this->foo();
}
public function foo() {
return $this->foo;
}
}
Di index.php saya, saya memuat mungkin foobarfunc()
seperti ini:
foobar::foobarfunc();
tapi bisa juga
$foobar = new foobar;
$foobar->foobarfunc();
Mengapa ada kesalahan?
Jawaban:
Anda tidak dapat memanggil metode dengan cara ini karena ini bukan metode statis.
Anda sebaiknya menggunakan:
Namun jika Anda telah membuat sesuatu metode statis seperti:
maka Anda dapat menggunakan ini:
sumber
$this->foo
adalah anggota kelas, sementara$foo
itu hanya variabel dalam lingkup fungsi (diimpor dari lingkup global). Nama fungsi dengan nama yang sama dengan anggota juga tidak menjadi masalah.$this
metode statis.::
. Hal ini melawanE_STRICT
, tapi tidak bekerja selama metode tubuh tidak referensi lingkup contoh, misalnya penggunaan$this
. Juga,self::foo
tidak akan menunjuk ke$this->foo
. Itu referensi kelas konstan . Keduanya,self::foo
danself::$foo
akan meningkatkan Kesalahan Fatal.Anda memanggil metode non-statis:
Menggunakan panggilan statis:
Saat menggunakan panggilan statis, fungsi akan dipanggil (bahkan jika tidak dinyatakan sebagai
static
) , tetapi, karena tidak ada turunan dari suatu objek, tidak ada$this
.Jadi:
Di sini, metode kelas Anda menggunakan instance kelas saat ini, karena mereka perlu mengakses
$foo
properti kelas.Ini berarti metode Anda memerlukan turunan kelas - yang berarti mereka tidak boleh statis.
Ini berarti Anda tidak boleh menggunakan panggilan statis: Anda harus membuat instance kelas, dan menggunakan objek untuk memanggil metode, seperti yang Anda lakukan di bagian kode terakhir:
Untuk informasi lebih lanjut, jangan ragu membaca, dalam manual PHP:
Perhatikan juga bahwa Anda mungkin tidak memerlukan baris ini dalam
__construct
metode Anda :Menggunakan
global
kata kunci akan membuat$foo
variabel, dideklarasikan di luar semua fungsi dan kelas, terlihat dari dalam metode itu ... Dan Anda mungkin tidak memiliki$foo
variabel seperti itu .Untuk mengakses
$foo
properti kelas , Anda hanya perlu menggunakan$this->foo
, seperti yang Anda lakukan.sumber
Jika Anda memohon
foobarfunc
dengan Operator lingkup resolusi (::
), maka Anda menyebutnya statis , misalnya pada tingkat kelas, bukan tingkat misalnya, sehingga Anda menggunakan$this
ketika tidak dalam konteks objek .$this
tidak ada dalam konteks kelas.Jika Anda mengaktifkan
E_STRICT
, PHP akan memunculkan Pemberitahuan tentang ini:Lakukan ini sebagai gantinya
Pada sidenote, saya sarankan untuk tidak menggunakan
global
di dalam kelas Anda. Jika Anda membutuhkan sesuatu dari luar kelas Anda, sampaikan melalui konstruktor. Ini disebut Dependency Injection dan itu akan membuat kode Anda lebih mudah dirawat dan kurang bergantung pada hal-hal luar.sumber
Pertama Anda mengerti satu hal, $ this di dalam kelas menunjukkan objek saat ini .
Itulah yang Anda buat di luar kelas untuk memanggil fungsi atau variabel kelas.
Jadi ketika Anda memanggil fungsi kelas Anda seperti foobar :: foobarfunc (), objek tidak dibuat. Tetapi di dalam fungsi itu Anda menulis pengembalian $ this-> foo (). Sekarang di sini $ ini bukan apa-apa. Itulah sebabnya katanya Menggunakan $ this ketika tidak dalam konteks objek di class.php
Solusi:
Buat objek dan panggil foobarfunc ().
Panggil foo () menggunakan nama kelas di dalam foobarfunc ().
sumber
Ketika Anda memanggil fungsi dalam konteks statis,
$this
sama sekali tidak ada.Anda harus menggunakannya
this::xyz()
sebagai gantinya.Untuk mengetahui konteks apa yang Anda hadapi ketika suatu fungsi dapat dipanggil secara statis dan dalam instance objek, pendekatan yang baik dijelaskan dalam pertanyaan ini: Bagaimana cara mengetahui apakah saya statis atau objek?
sumber
Metode cepat: (foobar baru ()) -> foobarfunc ();
Anda perlu memuat ganti kelas Anda:
oleh :
atau :
Atau buat fungsi statis untuk digunakan
foobar::
.sumber
$foobar = new foobar;
menempatkan foobar kelas dalam $ foobar, bukan objek . Untuk mendapatkan objek, Anda perlu menambahkan tanda kurung:$foobar = new foobar();
Kesalahan Anda hanya karena Anda memanggil metode pada kelas, jadi tidak ada
$this
karena$this
hanya ada di objek.sumber
Sepertinya saya menjadi bug di PHP. Kesalahannya
muncul di fungsi menggunakan
$this
, tetapi kesalahannya adalah bahwa fungsi panggilan menggunakan fungsi non-statis sebagai statis. Yaitu:Sementara kesalahan ada di sini:
sumber
Cukup gunakan metode Kelas menggunakan ini
foobar->foobarfunc();
sumber