fungsi statis php

108

Saya punya pertanyaan tentang fungsi statis di php.

mari kita asumsikan bahwa saya memiliki kelas

class test {
    public function sayHi() {
        echo 'hi';
    }
}

jika saya melakukannya, test::sayHi();itu berhasil tanpa masalah.

class test {
    public static function sayHi() {
        echo 'hi';
    }
}

test::sayHi(); bekerja dengan baik.

Apa perbedaan antara kelas satu dan kelas dua?

Apa yang spesial dari fungsi statis?

Bulan
sumber
15
Pada php7 Anda tidak dapat memanggil metode non statis secara statis
sanjay yadav

Jawaban:

153

Di kelas pertama, sayHi()sebenarnya adalah metode instance yang Anda panggil sebagai metode statis dan Anda lolos karena sayHi()tidak pernah merujuk $this.

Fungsi statis dikaitkan dengan kelas, bukan instance kelas. Karena itu, $thistidak tersedia dari konteks statis ( $thistidak mengarah ke objek apa pun).

Jonathan Fingland
sumber
22
Sekarang panggilan statis metode non-statis berfungsi tetapi tidak digunakan lagi. Hati-hati menggunakan sintaks ini untuk metode contoh!
Jet
1
Jadi ini mengapa mereka menyebutnya sebagai fungsi statis? karena tidak ada banyak contoh dengan aliran data dinamis dan keluaran dinamis. Pandu saja aku. @ Chaos
sun
22

Sederhananya, fungsi statis berfungsi secara independen dari kelas tempatnya berasal.

$ this artinya, ini adalah objek dari kelas ini. Ini tidak berlaku untuk fungsi statis.

class test {
    public function sayHi($hi = "Hi") {
        $this->hi = $hi;
        return $this->hi;
    }
}
class test1 {
    public static function sayHi($hi) {
        $hi = "Hi";
        return $hi;
    }
}

//  Test
$mytest = new test();
print $mytest->sayHi('hello');  // returns 'hello'
print test1::sayHi('hello');    //  returns 'Hi'
pengguna2132859
sumber
9
Oke, saya bukan penyihir PHP, tetapi bukankah variabel ('halo') yang diteruskan ke fungsi statis, secara eksplisit ditimpa dengan 'Hai'? Artinya garis print test1 :: sayHi ('hello'); tidak akan membalas 'halo', tetapi akan membalas 'hai'?
Fnord23
6
Jawaban ini ceroboh (efek dari fungsi statis dapat bergantung pada kelasnya) dan contohnya tidak memperjelas maksudnya.
reinierpost
Bukan contoh yang sangat bagus. $ hi = 'Hai'; menimpa argumen yang diberikan, dan tidak ada hubungannya dengan deklarasi statis. Saya akan memperbaiki ini seperti: self :: $ hi = $ hi; dan itu akan bekerja seperti yang non-statis. Anda dapat mengakses variabel kelas dengan self :: alih-alih $ this->
GotBatteries
20

Perbedaan utamanya adalah, Anda tidak mendapatkan $thispasokan di dalam fungsi statis. Jika Anda mencoba menggunakan $this, Anda akan mendapatkan file Fatal error: Using $this when not in object context.

Baiklah, satu perbedaan lainnya: E_STRICTperingatan dihasilkan oleh contoh pertama Anda.

kekacauan
sumber
1
saya tidak memiliki peringatan ketika saya menggunakan pertama dan saya di php7
ashkan nasirzadeh
Mengapa kita tidak memiliki $ this di dalam fungsi statis? Apa logika arsitektural ini? Terima kasih.
Lucas Bustamante
@LucasBustamante: $thismengacu pada objek saat ini. Dalam fungsi statis, tidak ada objek saat ini; fungsi ada di kelas tanpa perlu atau referensi ke instance objek dari kelas itu.
kekacauan
3

Memanggil metode non-statis secara statis menghasilkan peringatan level E_STRICT.


sumber
2

Singkatnya, Anda tidak memiliki objek sebagai $ this dalam kasus kedua, karena metode statis adalah fungsi / metode kelas, bukan instance objek.

Czimi
sumber
1
statis bagaimana Anda mendefinisikan fungsi kelas? tidak ada bisnis mewah lainnya? Jadi maksud Anda jika itu disebut "class_method" daripada "statis", itu akan menjadi lebih semantik?
ahnbizcad
1

Setelah mencoba contoh (PHP 5.3.5), saya menemukan bahwa dalam kedua kasus pendefinisian fungsi Anda tidak dapat menggunakan $thisoperator untuk mengerjakan fungsi kelas. Jadi saya belum bisa menemukan perbedaannya. :(

yogesh
sumber