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?


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).


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'

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.


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.


2

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


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. :(

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.