Saya punya kode ini:
private static $dates = array(
'start' => mktime( 0, 0, 0, 7, 30, 2009), // Start date
'end' => mktime( 0, 0, 0, 8, 2, 2009), // End date
'close' => mktime(23, 59, 59, 7, 20, 2009), // Date when registration closes
'early' => mktime( 0, 0, 0, 3, 19, 2009), // Date when early bird discount ends
);
Yang memberi saya kesalahan berikut:
Kesalahan Parse: kesalahan sintaksis, '(', mengharapkan ')' tak terduga 'di /home/user/Sites/site/registration/inc/registration.class.inc on line 19
Jadi, saya kira saya melakukan sesuatu yang salah ... tapi bagaimana saya bisa melakukan ini jika tidak seperti itu? Jika saya mengubah hal-hal mktime dengan string biasa, itu berfungsi. Jadi saya tahu bahwa saya bisa melakukannya semacam seperti itu ..
Adakah yang punya beberapa petunjuk?
php
class
static-members
Svish
sumber
sumber
Jawaban:
PHP tidak dapat mem-parsing ekspresi non-sepele dalam inisialisasi.
Saya lebih suka mengatasi ini dengan menambahkan kode tepat setelah definisi kelas:
atau
PHP 5.6 dapat menangani beberapa ekspresi sekarang.
sumber
init
mempublikasikan yang jelek. Apa solusi yang lebih baik?class Foo {public static $bar = array(3 * 4, "b" => 7 + 8);} var_dump(Foo::$bar);
Jika Anda memiliki kontrol atas pemuatan kelas, Anda dapat melakukan inisialisasi statis dari sana.
Contoh:
di pemuat kelas Anda, lakukan hal berikut:
Solusi yang lebih berat adalah menggunakan antarmuka dengan ReflectionClass:
di pemuat kelas Anda, lakukan hal berikut:
sumber
Daripada menemukan cara untuk membuat variabel statis berfungsi, saya lebih suka hanya membuat fungsi pengambil. Juga membantu jika Anda memerlukan array milik kelas tertentu, dan jauh lebih mudah untuk diterapkan.
Di mana pun Anda membutuhkan daftar, cukup panggil metode pengambil. Sebagai contoh:
sumber
Saya menggunakan kombinasi jawaban Tjeerd Visser dan porneL.
Tetapi solusi yang lebih baik adalah menghilangkan metode statis dan menggunakan pola Singleton. Maka Anda cukup melakukan inisialisasi yang rumit di konstruktor. Atau jadikan "layanan" dan gunakan DI untuk menyuntikkannya ke kelas yang membutuhkannya.
sumber
Itu terlalu rumit untuk ditetapkan dalam definisi. Anda dapat mengatur definisi ke nol, dan kemudian di konstruktor, periksa, dan jika belum diubah - setel:
sumber
Anda tidak dapat melakukan panggilan fungsi di bagian kode ini. Jika Anda membuat metode tipe init () yang dijalankan sebelum kode lain melakukannya, Anda akan dapat mengisi variabel itu.
sumber
Di PHP 7.0.1, saya dapat mendefinisikan ini:
Dan kemudian gunakan seperti ini:
sumber
Cara terbaik adalah membuat accessor seperti ini:
maka Anda dapat melakukan static :: db (); atau self :: db (); dari mana-mana.
sumber
Berikut ini adalah penunjuk yang mudah-mudahan bermanfaat, dalam contoh kode. Perhatikan bagaimana fungsi penginisialisasi hanya dipanggil sekali.
Juga, jika Anda membalikkan panggilan ke
StaticClass::initializeStStateArr()
dan$st = new StaticClass()
Anda akan mendapatkan hasil yang sama.Yang menghasilkan:
sumber
static { /* some code accessing static members*/ }