Konstanta dalam PHP. Pertanyaan yang Sering Diajukan (FAQ): Hal-Hal Yang Perlu Anda Ketahui Tentang Ruang Nama PHP Constant

Ada beberapa kasus di mana variabelnya cukup merepotkan untuk menggunakan nilai spesifik apa pun untuk penyimpanan konstan yang tidak berubah selama program. Nilai-nilai ini dapat menjadi konstanta matematika, jalur ke file, berbagai kata sandi, dll. Hanya untuk keperluan ini di PHP ada desain seperti itu.

disebut nilai bernama yang tidak berubah selama eksekusi program (skrip).

Di konstanta RNR ditentukan oleh fungsi mendefinisikan () . Fitur ini memiliki format berikut:

menetapkan. ($ Nama., $ Nilai, $ Case_sen.), Di mana:

$ Nama. - Nama konstanta;
$ Nilai - Nilai konstan;
$ Case_sen. - Parameter opsional dari jenis logis,
Menunjukkan apakah kasus huruf (benar) atau tidak (salah) harus dipertimbangkan.

Contoh menentukan dan menggunakan konstanta PHP:


echo Pi;
// Menampilkan 3.14.
?>

Jika parameternya $ Case_sen. Gagak benar.Penerjemah akan memperhitungkan daftar simbol saat bekerja dengan konstanta. Harap dicatat bahwa konstanta digunakan tanpa tanda sebelumnya. $ .

Perbedaan antara konstanta dan variabel:

    Konsol tidak konstan dalam bentuk tanda dolar ( $ );

    Konstanta dapat didefinisikan hanya menggunakan fungsi mendefinisikan () dan tidak menetapkan nilai;

    Konstanta dapat didefinisikan dan tersedia di mana saja tanpa memperhitungkan ruang lingkup;

    Konstanta tidak dapat ditentukan atau dibatalkan setelah iklan awal;

    Konstanta hanya dapat memiliki nilai skalar.

Verifikasi keberadaan konstanta

Untuk memverifikasi keberadaan konstanta, Anda dapat menggunakan fungsinya didefinisikan () . Fitur ini kembali benar.jika konstanta dinyatakan. Mari kita beri contoh:

// nyatakan konstanta PI
mendefinisikan ("pi", 3.14, benar);
jika (didefinisikan ("Pi") \u003d\u003d Benar) gema "Pi Constant diumumkan!";
// Script akan menampilkan "PI Constant diumumkan!"
?>

Konstanta PHP yang telah ditentukan sebelumnya

Konstanta yang telah ditentukan berikut ini ada di PHP:

PHP menyediakan daftar besar konstanta yang telah ditentukan untuk setiap skrip yang dapat dieksekusi. Banyak dari konstanta ini ditentukan oleh berbagai modul dan akan hadir hanya jika modul-modul ini tersedia sebagai hasil dari beban dinamis atau sebagai akibat dari perakitan statis.

Ada lima konstanta yang telah ditentukan yang mengubah nilai mereka tergantung pada konteks di mana mereka digunakan. Misalnya, Constanta __Garis__ Tergantung pada baris dalam skrip di mana konstanta ini ditunjukkan. Konstanta khusus tidak sensitif terhadap register dan daftar mereka ditunjukkan di bawah ini:

Nama Deskripsi
__Garis__ Baris saat ini dalam file.
__Mengajukan__ Jalur penuh dan nama file saat ini.
__Dir__ Direktori file. Jika digunakan di dalam, termasuk, direktori file yang disertakan dikembalikan. Ini setara dengan Dirname (__ file__). Nama direktori ini tidak memiliki tradisi slash kecuali itu adalah direktori root.
__Fungsi__ Nama fungsinya. (Ditambahkan ke PHP 4.3.0.)
__Kelas__ Nama kelas. (Ditambahkan ke PHP 4.3.0.)
__Sifat__ Nama sifat. Nama tait termasuk namespace yang dinyatakan dalam (mis. Foo \\ bar).
__Metode__ Nama metode kelas. (Ditambahkan ke PHP 5.0.0)
__Namespace__ Nama namespace saat ini.

Selain itu

Konstanta adalah pengidentifikasi (nama) untuk nilai sederhana. Seperti berikut dari nama, nilainya tidak dapat berubah selama eksekusi skrip (kecuali konstanta ajaib, yang sebenarnya bukan konstanta). Konstanta default sensitif terhadap register. Menurut perjanjian yang diadopsi, nama-nama konstanta selalu ditulis dalam huruf besar.

Nama konstanta harus mematuhi aturan penamaan yang sama dengan nama lain di PHP. Nama yang benar dimulai dengan huruf atau simbol garis bawah, diikuti oleh sejumlah huruf, angka, dan karakter garis bawah. Ekspresi reguler untuk memeriksa kebenaran nama konstan terlihat seperti ini: ^ * $

Dimungkinkan untuk menentukan konstanta menggunakan fungsi mendefinisikan () Nama cadangan atau bahkan salah yang nilainya mungkin (hanya) diperoleh melalui fungsi konstan (). Namun, tidak disarankan.

Contoh # 1 Nama konstan yang benar dan salah

// nama kanan konstan
mendefinisikan ("foo", "sesuatu");
mendefinisikan ("foo2", "sesuatu yang lain");
mendefinisikan ("foo_bar", "sesuatu yang lebih");

// Nama konstan yang salah
mendefinisikan ("2foo", "sesuatu");

// Ini adalah pengumuman yang setia, tetapi lebih baik tidak menggunakannya:
// php sekali dapat mendaftarkan konstanta ajaib,
// yang melanggar pekerjaan skrip
mendefinisikan ("__foo__", "sesuatu");

?>

Komentar: Konsep "huruf" di sini adalah simbol A-Z, A-Z, dan karakter lain dengan kode ASCII dari 128 hingga 255 (0x80-0xff).

2 tahun lalu.

Kinerja konstanta. Php 7.1.10 32 bit (opcache aktif, windows 10 i7-64bits) tetapi ternyata trennya sama dengan 5.x

menggunakan konstanta dinyatakan oleh Define ("CNS", Nilai): 0.6357560157759S
menggunakan konstanta dinyatakan oleh ConsT CNS \u003d Nilai: 0,61372208595276S
menggunakan variabel yang dinyatakan dengan $ V \u003d Nilai: 0.51184010505676S

Rata-rata, penggunaan define dan Const sekitar sama dengan beberapa kinerja Const yang lebih baik daripada mendefinisikan. Namun, menggunakan variabel sekitar 10-50% lebih baik daripada menggunakan konstanta. Jadi, untuk tugas intensif kinerja, konstan bukan pilihan terbaik.

$ p1 \u003d mikrotime (benar);
$ x \u003d 0;
untuk ($ i \u003d 0; $ i<50000000;$i++) {
$ x + \u003d CNS;
}
$ P2 \u003d mikrotime (benar);

14 tahun yang lalu.

Konstanta yang tidak terdefinisi mengevaluasi sebagai benar ketika tidak digunakan dengan benar. Katakan misalnya Anda memiliki sesuatu seperti ini:

pengaturan.php.
// mode debug.
mendefinisikan ("debug", false);
?>

test.php.
termasuk ("pengaturan.php");

if (debug) (
// gema beberapa data sensitif.
}
?>

Jika untuk beberapa alasan pengaturan.php tidak termasuk dan konstanta debug tidak disetel, PHP masih akan mencetak data sensitif. Solusinya adalah mengevaluasinya. Seperti:

pengaturan.php.
// mode debug.
mendefinisikan ("debug", 0);
?>

test.php.
termasuk ("pengaturan.php");

jika (debug \u003d\u003d 1) (
// gema beberapa data sensitif.
}
?>

Sekarang bekerja dengan benar.

Terakhir Diperbarui: 1.11.2015

Konstanta, serta variabel menyimpan nilai tertentu, hanya berbeda dengan variabel nilai konstanta dapat diinstal hanya sekali, dan kemudian kita tidak bisa lagi mengubahnya. Misalnya, kami mendefinisikan konstanta numerik:

Untuk menentukan konstanta, operator mendefinisikan digunakan, yang memiliki bentuk berikut: Definine (string $ name, string $ nilai, bool $ case_sen \u003d false). Parameter nama mentransmisikan nama konstanta, dan parameter $ nilai adalah nilainya. Parameter opsional ketiga menerima nilai logis benar atau salah. Jika nilainya salah, maka ketika menggunakan konstanta akan diperhitungkan sebagai daftarnya jika benar - register tidak diperhitungkan. Dalam kasus kami, parameter ketiga tidak digunakan, jadi sama dengan false secara default.

Setelah menentukan konstanta, kita dapat menggunakannya serta variabel biasa. Satu-satunya pengecualian - kami tidak akan dapat mengubah maknanya. Perbedaan lain dari variabel bukan untuk menggunakan tanda $. Yaitu, angka ekspresi adalah angka \u003d 33; Itu tidak akan bekerja.

Konstanta yang telah ditentukan sebelumnya

Selain programmer yang dibuat oleh programmer, ada beberapa konstanta bawaan di PHP:

    File__: Menyimpan jalur lengkap dan nama file saat ini

    Line__: menyimpan nomor baris saat ini proses penerjemah

    Dir__: menyimpan direktori file saat ini

    Fungsi__: Nama fungsi yang diproses

    Kelas__: Nama kelas saat ini

    Metode__: Nama metode olahan

    Namespace__: Nama namespace saat ini

Misalnya, tarik string yang dapat dieksekusi saat ini dan nama file:

Memeriksa keberadaan Konstanta

Untuk memeriksa apakah konstanta didefinisikan, kita dapat menggunakan fungsi BOOL Didefinisikan (String $ Name). Jika $ Name Constant didefinisikan, fungsinya akan kembali ke true

Konstanta - Ini adalah nilai yang tidak berubah seiring waktu. Dari sekolah Anda mungkin tahu banyak konstanta, misalnya, jumlahnya p, Nomor e., akselerasi jatuh bebas dan lainnya. Dan, tentu saja, ketika pemrograman juga, sangat sering kebutuhan untuk input konstan. Dan tentang bagaimana buat dan gunakan konstanta PHP, Kami akan berbicara dalam artikel ini.

Ayo bersamamu buat konstanta angka p:

Define (PI, 3.1415926);
Echo Pi;
?>

Operator menetapkan. Create. konstanta. Pi dan menugaskan maknanya 3.1415926 . Kemudian kita membawa konstan ini melalui operator gema.. Semuanya sangat sederhana, namun, ada satu rekomendasi yang saya sarankan untuk selalu mengikuti. Pastikan untuk menulis konstanta huruf kapital. Bukan berarti itu tentu saja, tetapi sangat diinginkan. Dan diterima tidak hanya di PHP., tetapi dalam bahasa lain juga.

Tentu saja, sesudahnya ubah konstanta PI tidak akan (tentang itu konstan).

Sekarang kita akan menganalisis satu fungsi yang memeriksa: " Adalah yang diberikan konstanta"Ayo kita menulis skrip seperti itu:

Jika (! Didefinisikan ("Pi")) mendefinisikan (PI, 3.1415926);
Echo Pi;
?>

Sini keberadaan konstanta diperiksa Pi. Dan jika itu tidak ada (yaitu define () Fungsi Vernoil. salah), kemudian inisialisasi konstanta ini. Kemudian tarik saja.

Seperti yang Anda lihat, buat dan gunakan konstanta dalam PHP. - Ini sangat sederhana.

Dan, akhirnya, saya ingin menceritakan konstanta PHP bawaan. Mari kita menulis skrip sederhana dengan Anda:

phpinfo ();
?>

Lebih dekat sampai akhir ada bagian " Variabel PHP."Sebenarnya, ini tidak cukup konstantaNamun, mereka konstanta. Saat melakukan skrip ini. Tentu saja, ketika melakukan skrip lain, mereka sudah memiliki nilai lain (bukan segalanya, tentu saja). Mari kita bawa pasangan denganmu konstanSehingga Anda memahami cara bekerja dengan mereka, karena mereka sering digunakan:

Echo $ _Server ["remote_addr"];
Echo "
";
Echo $ _Server ["query_string"];
?>

Dalam skrip ini kita berasal Alamat IP penggunaMenjalankan skrip, dan pada baris berikutnya kami menampilkan string kueri (misalnya, " index.php? id \u003d 7"). Mencari sedikit ke depan, katakan di sini kita bekerja dengan global array $ _server. Kami masih bertemu dengan array, tetapi saya berpikir bahwa mereka yang telah bekerja dengan array dalam bahasa pemrograman lain, sintaksia mengenali tanpa masalah. Adapun orang lain konstan, kemudian dengan mereka pekerjaan terjadi serupa.

Untuk setiap skrip yang dapat dieksekusi. Banyak dari konstanta ini ditentukan oleh berbagai modul dan akan hadir hanya jika modul-modul ini tersedia sebagai hasil dari beban dinamis atau sebagai akibat dari perakitan statis.

Ada sembilan konstanta ajaib yang mengubah nilai mereka tergantung pada konteks di mana mereka digunakan. Misalnya, nilai __Garis__ Tergantung pada baris dalam skrip di mana konstanta ini ditunjukkan. Semua konstanta sihir diperbolehkan selama kompilasi, berbeda dengan konstanta konvensional yang diizinkan selama eksekusi. Konstanta khusus tidak sensitif terhadap register dan daftar mereka ditunjukkan di bawah ini:

Beberapa konstanta php ajaib
Nama Deskripsi
__Garis__ Nomor baris saat ini dalam file.
__Mengajukan__ Jalur penuh dan nama file saat ini dengan simlink yang digunakan. Jika digunakan di dalam file plug-in, maka nama file ini dikembalikan.
__Dir__ Direktori file. Jika digunakan di dalam file plug-in, direktori file ini dikembalikan. Ini setara dengan menelepon dirname (__ file__). Nama pengembalian direktori tidak berakhir pada lay, dengan pengecualian direktori root.
__Fungsi__ Nama fungsi atau (Penutupan) Dalam hal fungsi anonim.
__Kelas__ Nama kelas. Nama ini berisi nama namespace, di mana kelas diumumkan (misalnya, Foo \\ bar.). Harap dicatat bahwa dimulai dengan PHP 5.4 __Class__ juga berfungsi dengan sifat. Ketika digunakan dalam metode ciri __class__ adalah nama kelas di mana metode ini digunakan.
__Sifat__ Nama sifatnya. Nama ini berisi nama namespace, di mana sifat dinyatakan (misalnya, Foo \\ bar.).
__Metode__ Nama metode kelas.
__Namespace__ Nama namespace saat ini.
ClassName :: Kelas Nama kelas penuh (menunjukkan namespace). Lihat juga :: kelas.

Lihat juga get_class (), get_object_vars (), file_exists () dan fungsi_exists ().

Daftar perubahan

14 tahun yang lalu.

Perbedaan antara.
__Function__ dan __Method__ seperti pada PHP 5.0.4 adalah itu

Fungsi hanya mengembalikan nama fungsinya

sementara sebagai __method__ mengembalikan nama kelas bersama dengan nama fungsinya

trik kelas.
{
Fungsi DOIT ()
{
echo __function__;
}
Fungsi doitagain ()
{
Echo __method__;
}
}
$ Obj \u003d trik baru ();
$ OBJ-\u003e DOIT ();
output akan ---- DOIT
$ Obj-\u003e doitagain ();
output akan ----- trik :: doitagain

13 tahun yang lalu.

Konstanta afclass__ ajaib dengan baik memola fungsi get_class ().

Terkadang Anda perlu tahu keduanya:
- Nama kelas yang diwarisi
- Nama kelas yang benar-benar dieksekusi

Ini sebuah contoh yang menunjukkan solusi yang mungkin:

Kelas base_class.
{
Fungsi say_a ()
{

" ;
}

Fungsi say_b ()
{

" ;
}

kelas turunan_class memperluas base_class
{
Fungsi say_a ()
{
orangtua :: say_a ();
Echo "" a "- kata". __Kelas__. "
" ;
}

Fungsi say_b ()
{
orangtua :: Say_b ();
Echo "" B "- kata". get_class ($ ini). "
" ;
}
}

$ Obj_b \u003d baru turunan_class ();

$ Obj_b -\u003e say_a ();
echo "
" ;
$ Obj_b -\u003e say_b ();

?>

Output shll terlihat kira-kira seperti ini:

"A" - kata base_class
"A" - kata turunan_class

"B" - kata turunan_class
"B" - kata turunan_class

3 tahun yang lalu.

Perhatikan sedikit inkonsistensi saat menggunakan __class__ dan __method__ dalam sifat (stand php 7.0.4): sementara __class__ berfungsi sebagaimana diiklankan dan mengembalikan secara dinamis nama kelas yang sedang digunakan, __method__ akan benar-benar menyiapkan nama sifat bukannya Nama kelas!

8 tahun yang lalu.

Tidak ada cara untuk mengimplementasikan versi __dir__ yang kompatibel ke belakang sebelum 5.3.0.

Satu-satunya hal yang dapat Anda lakukan adalah melakukan pencarian rekursif dan mengganti ke dirname (__ file__):
temukan. -Type f -Print0 | Xargs -0 sed -i "s / __ dir __ / dirname (__ file __) /"

5 tahun lalu.

Banyak catatan di sini keprihatinan mendefinisikan konstanta ajaib __dir__ untuk versi PHP yang tidak mendukung fitur. Tentu saja Anda dapat mendefinisikan konstanta sihir ini untuk versi PHP belum memiliki konstan ini, tetapi akan mengalahkan tujuannya segera setelah Anda menggunakan konstanta dalam file yang disertakan, yang mungkin berada di direktori yang berbeda maka file yang mendefinisikan __dir__ Konstan. Dengan demikian, konstanta telah kehilangan * ajaib *, dan akan agak tidak berguna kecuali Anda meyakinkan diri sendiri untuk memiliki semua termasuk dalam direktori yang sama.

Kesimpulan: Catatan Mata di Catatan Gmail Dot Com mengenai apakah Anda tidak dapat mendefinisikan konstanta ajaib yang valid, tetapi menyatakan bahwa mendefinisikan __dir__ tidak sia-sia, bukan!

7 tahun yang lalu.

Anda tidak dapat memeriksa apakah konstanta ajaib didefinisikan. Ini berarti tidak ada gunanya memeriksa apakah __dir__ didefinisikan kemudian mendefinisikannya. `Didefinisikan (" __ dir __ ")` selalu mengembalikan false. Mendefinisikan __dir__ akan secara diam-diam gagal dalam PHP 5.3+. Ini dapat menyebabkan masalah kompatibilitas jika skrip Anda mencakup skrip lain.

echo (didefinisikan ("__dir__")? "__Dir__ didefinisikan": "__dir__ tidak didefinisikan." Php_eol);
gema (didefinisikan ("__file__")? "__File__ didefinisikan": "__File__ tidak didefinisikan." Php_eol);
echo (didefinisikan ("php_version")? "Php_version didefinisikan": "php_version tidak ditentukan"). Php_eol;
echo "Versi PHP:". Php_version. Php_eol;
?>
Keluaran:
__Dir__ tidak didefinisikan
__File__ tidak didefinisikan
Php_version didefinisikan.
Versi PHP: 5.3.6